android - 处理 Activity 和 Thread 之间关系的常见做法是什么

标签 android multithreading android-asynctask orientation-changes android-configchanges

我有以下情况

  1. 我从 Activity 生成一个长时间运行的用户线程 (Thread)。
  2. 我按下软后退按钮。因此,Activity 被销毁了。
  3. 我再次启动相同的 Activity。注意,之前启动的Thread还在运行。

为了防止 Activity 在前一个 Thread 仍在运行时启动另一个相同的 Thread,这就是我的意思做

  • 启动Thread 后,我会将其存储到一个静态变量中。因此,下次当我尝试启动同一个线程时,我将通过静态变量检查前一个线程的活跃度。 这是一个好的做法吗?克服这个问题的最佳做法是什么?

请注意,用户线程持有对启动它的 Activity 的引用。但是,当用户按下软后退按钮时,Activity 可能会被破坏。所以,当我再次启动新的 Activity 时,thread 并没有意识到这一点,它仍然引用旧的 Activity。因此,当用户线程尝试访问旧 Activity 的任何成员时,由于 Activity 已经被销毁,将会发生崩溃。 克服这个问题的最佳做法是什么?

最佳答案

克服此问题的最佳方法是改用 AsyncTask。如果 Activity 在任务执行时被销毁,则 AsyncTask(及其正在执行操作的底层 Thread)将继续执行直到doInBackground() 已完成。如果在调用 onPostExecuteActivitynull,您将不会遇到任何 NullPointerException blog post中陈述的原因.

如果您希望在用户“退出”Activity 时立即取消任务,您可以在您的AsyncTask 上调用mTask.cancel() 在您的 ActivityonDestroy 方法中。

如果您不想在用户“退出”Activity 时立即取消任务,那么您的长期操作听起来不像它特定于任何 Activity 实例。在这种情况下,通常建议改用 Service

关于android - 处理 Activity 和 Thread 之间关系的常见做法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11380357/

相关文章:

android - 使用 ViewPager、PagerAdapter 和 AsyncTask 的 Activity 会导致出现空白 View

java - AsyncTask下载的文件为0B

java - 如何更改我的 fragment 中的文件 XML 属性

java - Java中如何实现线程安全的HashMap取值时延迟初始化?

c# - c# 非常小的控制台应用程序中的默认线程 (Visual Studio 2012)

c# - C#中的任务栈分配在哪里?

java - AsyncTask 不会在第一次尝试时调用 OnCancel()

android - 在 iOS 中管理核心对象

Android - 横向覆盖的导航栏

java - 如何在Activity和其他Activity创建的线程之间进行通信