android - 在清理完成之前阻止 Android Activity 退出

标签 android multithreading android-activity

我的 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/

相关文章:

c - 我想知道是否有办法将 OpenMP 中的特定线程分配给特定的 CPU 核心?

c - 如何在线程迭代次数不相等的 while 循环上使用 omp 屏障

java - Android 在同一 Activity 中打开联系人列表

android - 一个 Java 文件中的两个下一个函数

android - *.ics 文件到 android 中的谷歌日历

java - java中的preg_replace等效项

java - 我的 Android 应用程序上有 34 个按钮。有什么方法可以避免为每个人编写 onclicklistener 吗?

从线程的队列中获取时出现 Java 'NoSuchElementException'

当按下后退按钮并在 Android 模拟器上崩溃时,Android 应用程序变得无响应

android - 将数据从 Activity 传回已创建的 fragment