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

时间:2012-01-03 02:07:18

标签: android multithreading android-activity

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

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

2 个答案:

答案 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清理。