活动的背景线程&配置改变

时间:2012-06-01 15:21:34

标签: android multithreading configuration android-activity orientation

我在Stack Overflow上看到了一些与使用Activity.onRetainNonConfigurationInstance()相关的讨论,以维护一个Activity的一个实例启动的后台线程,并将其传递给Activity的下一个实例,例如,当手机的方向从纵向变为风景。

讨论没有详细说明从onRetainNonConfigurationInstance()返回的Object中包含的线程可以做些什么。

例如: 1.有没有办法使用这种技术实际保持后台线程运行? 2.当前一个Activity实例消失时,你是否需要以某种方式暂停线程,然后在新实例中再次重新启动它?

任何人都可以提供一个简短的例子吗?

任何细节都将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以将任何内容返回onRetainNonConfigurationInstance()。如果您有一个要从一个Activity实例传递给另一个实例的Thread,您可以直接返回它,或者将它放在从onRetainNonConfigurationInstance()返回的另一个对象中。您无需以任何方式暂停线程或与之交互。它只是一直在运行,好像什么也没发生。

您唯一需要关注的是线程如何与Activity交互(如果有的话)。如果线程将回调用Activity(表示进度或类似的东西),那么你需要给线程一个对新Activity的引用,因为旧的Activity将会死掉。

你想在后台线程做什么?

编辑(添加有关线程/活动的更多详细信息):

线程有自己的生命周期,与活动完全断开连接。如果您在一个Activity中创建一个Thread并启动它,那么无论您的Activity是什么,它都将运行完成。唯一能够明确停止线程的是Android决定杀死你的进程(如果你的进程不包含活动活动,它可能会这样做。)

答案 1 :(得分:0)

线程将继续运行。有关您可以执行此操作的示例,您可以查看android Ignition项目及其IgnitedAsyncTask(以及相关示例)。

您的想法是,您将在AsyncTask中的某个位置保留对您的主题(通常是Activity)的引用,有时候也会保留您的主题(再次,特别是如果它是AsyncTask)将需要引用Context以便在后台任务结束时执行某种UI更新。您需要确保您的线程具有引用的Context(以及从它派生的任何内容 - 如TextView或类似内容)非空,否则它将崩溃。

您可以使用getLastNonConfigurationInstance()设置Activity对线程的引用,然后调用线程上的setter来设置其Context引用(以避免任何相关的空指针)崩溃)。