如果我在退出Android应用程序时让线程继续运行,那么在重新启动应用程序时是否可以访问该线程?我知道该帖子仍然与我的应用程序相关联,因为我可以通过设置-apps-force stop来杀死它。
更多细节:我的应用通过蓝牙连接到设备。当我旋转平板电脑时,它重新启动应用程序,但如果我没有停止所有线程,旧线程将重新连接到设备,并且应用程序无法连接新线程。
我已经通过不允许应用程序屏幕旋转并通过终止连接线程onDestroy()来修复基本问题。但我想知道如何出于好奇而重新连接那种僵尸线程。
我可以在Thread.enumerate()中看到我无法识别的线程,但除了查看名称及其状态之外,我不知道如何访问这些线程。
答案 0 :(得分:0)
我在我的应用中处理此问题的方法是覆盖Activity的onRetainCustomNonConfigurationInstance()
方法,该方法允许您通过重置屏幕旋转时保留对象。这是我实现它的方式。
我有一个执行Web请求的AsyncTask。 AsyncTask位于一个单独的文件中,并引用调用Activity作为我已实现的一些回调的监听器。所以我的Web请求AsyncTask的构造函数是这样的:
private Callbacks listener;
public WebRequest(Callbacks listener) {
this.listener = listener;
}
我在我的Activity中实现onRetainCustomNonConfigurationInstance()
,如下所示:
@Override
public Object onRetainCustomNonConfigurationInstance() {
if(webRequest != null) {
webRequest.detachFromActivity();
return webRequest;
} else {
return null;
}
}
现在,当我的屏幕旋转时,Activity重新启动,如果我的AsyncTask正在运行,它将在此处保存对它的引用。请注意,我还从当前活动“分离”我的任务,现在将销毁该活动。我通过使侦听器(当前的Activity)为null来完成我的任务。像这样:
public void detachFromActivity() {
listener = null;
}
现在当Activity重新启动时,在onCreate()
中,我通过调用getLastCustomNonConfigurationInstance()
来检查是否有对我正在运行的线程的保留引用:
Object retainedRequest = getLastCustomNonConfigurationInstance();
if(retainedRequest != null) {
if(retainedRequest instanceof WebRequest) {
webRequest = (WebRequest) retainedRequest;
webRequest.setListener(this);
}
}
由于对我正在运行的线程的引用是作为Object
传递的,我需要将其作为Object检索,然后检查它是否是我的AsyncTask的一个实例,然后如果它是,则将其转换。
最后一步是将回调“重新连接”到刚刚创建的新活动,因此任务知道将结果发送到何处。我使用setListener(this)
方法在我的任务中执行此操作,如下所示:
public void setListener(Callbacks listener) {
this.listener = listener;
}
现在我可以使用新重新创建的Activity重新附加对旧线程的引用。您可能没有使用AsyncTask,但概念是相同的,并且应该适用于任何Thread或您想要的任何对象。
希望这有帮助!
答案 1 :(得分:0)
我m not sure on your question, but what you are doing is kinda wrong. Screen rotation are UI changes and they should not affect your other code.
Check this answer for some guidance- http://stackoverflow.com/questions/5913130/dont-reload-application-when-orientation-changes
PS: NoChinDeluxe
的回答也适用于将UI与其他元素分离
答案 2 :(得分:0)
正如您所发现的,基本问题是您已经实现了应用程序,使您的蓝牙连接在逻辑上绑定到Activity(即,Activity负责跟踪线程处理蓝牙活动)。
要让蓝牙连接参考在旋转中存活,您需要将其与活动分离。有很多方法可以做到这一点,具体取决于您的要求。
例如,您可以将蓝牙代码实现为服务。 还有其他方法 - 例如,看看Activity restart on rotation Android