我的活动有一个工作线程。退出活动时(例如onPause()),我正在向该线程发送一条消息,除非出现问题,否则它应在短时间内(毫秒)结束。
通常,我会在onPause()中使用join(),但是在这种情况下,该线程必须使用UI线程才能执行其关闭顺序(关闭Accessory文件描述符与其他任何线程都不起作用) 。
因此,尝试阻止UI线程将导致死锁。我正在寻找一种解决方案,它将以某种方式将应用程序退出推迟到线程退出之后。
可能的话,如果我可以在这种情况下中止退出,则可以稍后手动调用finish(),但是我不确定是否可以这样做(终止)。
仅假设线程最终将完成其清理并退出似乎是非常不安全的做法。
最佳答案
如您所说,您不能让UI线程无限期地等待后台线程停止。
您可以执行以下操作。
1)中断onPause()中的线程。(如果您希望在清除过程中保留任何信息)
2)如果您想保留一些信息并执行干净退出,则可以在onPause()中启动Androiod服务并在那里进行清理。
(在线程中及时检查布尔值标志)
ex:一个伪示例
void run(){
while(true){
if(bExit){
doCleanupWork();
}
//Do work
doWork();
}
}
void doCleanupWork(){
startCleanupService();
}
void onPause(){
bExit = true;
}
编辑
3)覆盖Activity类的onBackPressed(),使其不会直接退出。启动AsyncTask并向用户显示一个对话框,指示在doInBackground()中发生清理调用时的处理。如果不确定清理是否会被挂起,您需要重新检查代码,如果需要,请在超时后中断线程。