Android-当startActivity完成时,属于MainActivity的类对象与子活动不匹配



首先,我是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中运行的线程。

如果蓝牙设备已连接,字符串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()时,它会产生同一类的另一个线程,但不会与我之前创建的对象链接。我不知道该怎么解决。

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

您可以将singleton与以下侦听器一起使用:

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:中的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");

通知所有侦听器(=活动的活动)状态。

相关内容

  • 没有找到相关文章

最新更新