我有以下情况
- 我从
Activity
生成一个长时间运行的用户线程 (Thread
)。 - 我按下软后退按钮。因此,
Activity
被销毁了。 - 我再次启动相同的
Activity
。注意,之前启动的Thread
还在运行。
为了防止 Activity
在前一个 Thread
仍在运行时启动另一个相同的 Thread
,这就是我的意思做
- 启动
Thread
后,我会将其存储到一个静态变量中。因此,下次当我尝试启动同一个线程时,我将通过静态变量检查前一个线程的活跃度。 这是一个好的做法吗?克服这个问题的最佳做法是什么?
请注意,用户线程持有对启动它的 Activity
的引用。但是,当用户按下软后退按钮时,Activity
可能会被破坏。所以,当我再次启动新的 Activity 时,thread
并没有意识到这一点,它仍然引用旧的 Activity
。因此,当用户线程尝试访问旧 Activity
的任何成员时,由于 Activity
已经被销毁,将会发生崩溃。 克服这个问题的最佳做法是什么?
最佳答案
克服此问题的最佳方法是改用 AsyncTask
。如果 Activity
在任务执行时被销毁,则 AsyncTask
(及其正在执行操作的底层 Thread
)将继续执行直到doInBackground()
已完成。如果在调用 onPostExecute
时 Activity
为 null
,您将不会遇到任何 NullPointerException
此 blog post中陈述的原因.
如果您希望在用户“退出”Activity
时立即取消任务,您可以在您的AsyncTask 上调用
在您的 mTask.cancel()
Activity
的 onDestroy
方法中。
如果您不想在用户“退出”Activity
时立即取消任务,那么您的长期操作听起来不像它特定于任何 Activity
实例。在这种情况下,通常建议改用 Service
。
关于android - 处理 Activity 和 Thread 之间关系的常见做法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11380357/