Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
阻止Android活动退出,直到清理完成_Android_Multithreading_Android Activity - Fatal编程技术网

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

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

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


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

正如您所说,您不能让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()中进行清理调用时正在处理。如果不确定清理是否会被挂起,您需要重新检查代码,如果需要,请在超时后中断线程。

正如您所说,您不能让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()中进行清理调用时正在处理。如果不确定清理是否会被挂起,您需要重新检查代码,如果需要,在超时后中断线程。

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

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

但这将在处理了
onPause()
onStop()
消息之后发生,因此应用程序已经退出,不是吗?我试图实现的是将应用程序的退出延迟到线程退出之后,但不阻塞
join()
上的UI线程(因为线程清理的一部分涉及到在UI线程上执行工作,这将导致死锁)。hmmmm--我只需简单地告诉线程从顶部关闭即可。。。我不认为有任何方法可以“中止”关闭,所以您所能做的就是让线程知道如何完成它的关闭过程。您是否担心线程可能无法完全清理?它应该有时间做它需要做的事情(即,当UI线程完成时,工作线程不会立即被终止)。我担心的是捕获清理问题。我宁愿得到一个ANR,也不愿有一条被卡住的线躺在周围。。。另外,我想确保应用程序在干净地退出之前不会重新启动。在许多情况下,应用程序会停止/立即重新启动,这可能会导致问题。但这会在处理
onPause()
onStop()
消息后发生,因此应用程序已经退出,不是吗?我试图实现的是将应用程序的退出延迟到线程退出之后,但不阻塞
join()
上的UI线程(因为线程清理的一部分涉及到在UI线程上执行工作,这将导致死锁)。hmmmm--我只需简单地告诉线程从顶部关闭即可。。。我不认为有任何方法可以“中止”关闭,所以您所能做的就是让线程知道如何完成它的关闭过程。您是否担心线程可能无法完全清理?它应该有时间做它需要做的事情(即,当UI线程完成时,工作线程不会立即被终止)。我担心的是捕获清理问题。我宁愿得到一个ANR,也不愿有一条被卡住的线躺在周围。。。另外,我想确保应用程序在干净地退出之前不会重新启动。在许多情况下,应用程序会停止/立即重新启动,这可能会导致问题。在应用程序退出后执行清理不是问题所在。问题是将应用程序退出推迟到清理完成。关于(3):onBackPressed()不是应用程序退出的唯一情况。任何试图覆盖所有可能的退出路径的尝试,如果可能的话,都是非常不可靠的,不可移植的,也不适合未来。至于异步任务,这是完全不必要的。通常,清理将花费毫秒。我只是想抓住它挂起的任何机会,并确保应用程序在完全清理上一次运行之前不会重新启动。在应用程序退出后执行清理不是问题。