首先,我是Android环境的新手,如果我说了一些没有意义的话,请原谅。
现状
我正在做一个有两个活动的应用程序:MainActivity和GraphActivity。
此外,我有一个类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");
通知所有侦听器(=活动的活动)状态。