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