【发布时间】:2019-12-11 16:52:18
【问题描述】:
当您有 2 个活动( A 和 B )并且 A 是 MainActivity 时,现在您启动您的应用程序并且 A 启动 B。 B 是一个 Dialog 与用户交互的活动,创建一个蓝牙连接和 2 个线程,1 个接收和一个发送。 现在,将信息从 A 发送到 B 的线程的最佳方式是什么,反之亦然?
一开始我用的是静态的WeakReference,但是听说这会导致很多问题,所以想求一个更通用的解决方案。
请记住,当从另一个 Activity 启动一个 Activity 时,您只能传递 Serializable Objs 和简单数据。所以不可能那样使用Handler。
这是我使用的静态 WeakReference:
public class T1 extends Thread{
private static WeakReference<T1> weak_T1;
public void T1 (){
weak_T1 = new WeakReference<T1> (This);
}
public static WeakReference getWeakReverence() {
return weak_T1;
}
}
这是一种在堆栈中查找正在运行的线程的方法:
for (Thread thread : Thread.getAllStackTraces().keySet()) {
if (thread.getName().equalsIgnoreCase("T1")){
T1A =thread;
}else if (thread.getName().equalsIgnoreCase("T2")){
T2A =thread;
}
}
也可能的解决方案:
public class example extends Thread {
private static example instance;
private example() {
}
public static example getIsntance(){
if(instance == null){
instance = new example();
}
return instance;
}
}
【问题讨论】:
-
只是好奇,如何防止系统在 Activity B 显示时破坏 Activity A?
-
@greeble31 A 是 B 的父级,所以 A 只是 onPause 而不是 onDestroy。或者也许我不明白你的问题,但为什么 A 应该被破坏?
-
@greeble31 明确一点,线程启动后,活动 B 完成,A 再次处于前台。
-
我的意思是,你不能保证活动 A 保持在“暂停”状态(或者实际上是“停止/隐藏”,在这种情况下,状态)任何长度时间。正如docs 中提到的,停止的活动“......当其他地方需要内存时,通常会被系统杀死”。尝试与屏幕外 Activity 进行通信是不行的。您需要将线程结果保存在某处(例如 Service 甚至静态引用),然后让 Activity A 在恢复后获取该信息。
-
您如何看待“get Thread in Stack”解决方案?风险是得到一个空指针异常,但我想不出其他问题。
标签: java android multithreading android-activity communication