Android - 属于 MainActivity 的 class 对象在 startActivity 完成后与子 activity 不匹配
Android - A class object that belong to MainActivity not match with the sub-activity when startActivity is done
首先,我是Android环境的新手,所以如果我说的没有意义,请原谅。
现状
我正在做一个有两个活动的应用程序:
MainActivity 和 GraphActivity.
我还有一个 class BLEConnection,我希望它知道这两个活动。
MainActivity 只有一个按钮。
按钮的onClick():
GraphActivity graph_activity = new GraphActivity();
BLEConnection radino_right = new BLEConnection(mainThread, graph_activity);
btnConnect.setText("Connecting");
class 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 不匹配。
有谁知道我该如何解决这个问题?
我认为,如果我在创建 activity 对象时执行 "new",它会生成一个新线程 GraphActivity,而当我调用 startActivity() 时,它会生成另一个相同的线程 class,但没有与我之前创建的先前对象链接。
我不知道怎么解决。
好的,我认为你应该重构一下。的确,您创建了 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 让您的 Activity 实现接口:
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");
通知所有听众(=活动活动)状态。
首先,我是Android环境的新手,所以如果我说的没有意义,请原谅。
现状
我正在做一个有两个活动的应用程序: MainActivity 和 GraphActivity.
我还有一个 class BLEConnection,我希望它知道这两个活动。 MainActivity 只有一个按钮。
按钮的onClick():
GraphActivity graph_activity = new GraphActivity();
BLEConnection radino_right = new BLEConnection(mainThread, graph_activity);
btnConnect.setText("Connecting");
class 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 不匹配。
有谁知道我该如何解决这个问题?
我认为,如果我在创建 activity 对象时执行 "new",它会生成一个新线程 GraphActivity,而当我调用 startActivity() 时,它会生成另一个相同的线程 class,但没有与我之前创建的先前对象链接。 我不知道怎么解决。
好的,我认为你应该重构一下。的确,您创建了 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 让您的 Activity 实现接口:
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");
通知所有听众(=活动活动)状态。