0

首先,我是Android环境的新手,如果我说一些没有意义的话,请原谅。

现在的情况

我正在做一个有两个活动的应用程序: MainActivityGraphActivity

我还有一个 BLEConnection 类,我希望它知道这两个活动。MainActivity 只有一个按钮。

onClick() 按钮:

GraphActivity graph_activity = new GraphActivity();
BLEConnection radino_right = new BLEConnection(mainThread, graph_activity);
btnConnect.setText("Connecting");

BLEConnection 类有一个 BluetoothGattCallback() 对象,当它检测到 onConnectionStateChange() 时,它会调用 MainActivity 中运行的线程。

如果蓝牙设备已连接,String connect_status = "Connected",则该线程创建一个 Intent 并执行 startActivity()。

MainActivity 中运行的线程:

Thread mainThread = new Thread(new Runnable() {
    @Override
    public void run() {
        if(connect_status.equals("Connected")){
            Intent nextScreen = new Intent(getApplicationContext(), ((Object) graph_activity).getClass());
            //startActivityForResult() instead of startActivity() because I want to finish() it from the MainActivity if the connection with the device is closed.
            startActivityForResult(nextScreen,1);
        }
        else{
            if(nextScreen != null){
                finishActivity(1);
            }
        }
    }
});

故障排除

我遇到的故障排除是我注意到属于 MainActivity 并且我传递给 BLEConnection 的对象 graph_activity 与使用 startActivity() 方法启动的真实 GraphActivity 不匹配。

有谁知道我该如何解决这个问题?

我认为,如果我在创建活动对象时执行“新”操作,它会生成一个新线程 GraphActivity,当我调用 startActivity() 时,它会生成同一类的另一个线程,但未与我创建的先前对象链接前。我不知道如何解决。

4

1 回答 1

0

好的,我认为你应该重构一下。确实,您创建了 2 个不同的 graphactivity 实例。你不需要第一个。

你可以像这样使用带有监听器的单例:

1 使 BLEConnection 成为单例:

public class BLEConnection {
    private static BLEConnection singletonInstance = new BLEConnection();

    private BLEConnection() {} //constructor cannot be called from outside

    public static BLEConnection getInstance() {
        return singletonInstance;
    }

    (... your Stuff here)
}

现在 BLEConnection 将留在内存中,如果您调用,您将始终获得相同的实例

BLEConnection bleconnection = BLEConnection.getInstance(); 

从您的应用程序的任何位置。

2 创建监听接口:

public interface BLEConnectionListener {
    void statusUpdated(String newStatus);
    //you can write more functions here. Every activity from step 3 has to implement them
}

3 让您的活动实现接口:

public class MainActivity implements BLEConnectionListener {
    public void statusUpdated(String newStatus) {
        //do your thread thing here if you want to...
    }
}

public class GraphActivity implements BLEConnectionListener {
    public void statusUpdated(String newStatus) {
        //do graph stuff here
    }
}

4 通知 BLEConnection 有关接口:

onResume / onPause 中的 MainActivity 和 GraphActivity:

public void onResume() {
    // bla
    BLEConnection bleConnection = BLEConnection.getInstance(); 
    bleConnection.addListener(this);
}

public void onPause() {
    // bla
    BLEConnection bleConnection = BLEConnection.getInstance(); 
    bleConnection.removeListener(this);
}

更新 BLEConnection

public class BLEConnection {

    private ArrayList<BLEConnectionListener> listeners = new ArrayList<BLEConnectionListener>();

    public void addListener(BLEConnectionListener listener) {
        if (!listeners.contains(listener)) {
            listeners.add(listener);
        }
    }

    public void removeListener(BLEConnectionListener listener) {
        if (listeners.contains(listener)) {
            listeners.remove(listener);
        }
    }

    public void forwardStatusUpdate(String statusString) {
        for (BLEConnectionListener listener: listeners) {
            listener.statusUpdated(statusString);
        }
    }
}

我希望这是可以理解的。在 BLEConnection 中,您现在可以调用

forwardStatusUpdate("Connected");

通知所有听众(=活动活动)有关状态。

于 2015-12-16T11:41:13.583 回答