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