阻止Android活动退出,直到清理完成



我有一个由我的活动运行的工作线程。当退出活动(例如onPause())时,我会向这个线程发送一条消息,它应该在几毫秒后完成,除非出现问题。通常,我会在onPause()中使用join(),但在这种情况下,这个线程必须使用UI线程才能执行其关闭序列(关闭附件文件描述符似乎在任何其他线程中都不起作用)。因此,试图阻塞UI线程将导致死锁。我正在寻找一种解决方案,以某种方式将应用程序退出推迟到线程退出之后。可能,如果在这种情况下我可以中止退出,我以后可以手动调用finish(),但我不确定是否可以这样做(中止)。

仅仅假设线程最终会完成清理并退出似乎是一种非常不安全的做法。

正如您所说,您不能让UI线程无限期地等待后台线程停止。

你可以做以下事情。

1) 在onPause()中中断线程。(如果你想在清理过程中保留任何信息,这不会持续存在)

2) 如果你想保留一些信息并执行干净的退出,你可以在onPause()中启动一个Andriod服务并在那里进行清理。(及时在线程中检查布尔标志)例如:一个伪示例

void run(){
while(true){
   if(bExit){
    doCleanupWork();
   }
  //Do work
  doWork();
  }
}
void doCleanupWork(){
startCleanupService();
}
void onPause(){
bExit = true;
}

编辑

3) 重写Activity类的onBackPressed(),使其不会直接退出。启动AsyncTask并向用户显示一个对话框,指示在doInBackground()中进行清理调用时的处理。如果您不确定清理可能会挂起,则需要重新检查代码,如果需要,则在超时后中断线程。

在UI线程中声明一个处理程序。当其他线程完成时,从其他线程向该处理程序发送一条(空)消息,这将导致handleMessage方法在UI线程上执行。在handleMessage中进行最后的UI清理。

最新更新