我在Stack Overflow上看到了一些与使用Activity.onRetainNonConfigurationInstance()相关的讨论,以维护一个Activity的一个实例启动的后台线程,并将其传递给Activity的下一个实例,例如,当手机的方向从纵向变为风景。
讨论没有详细说明从onRetainNonConfigurationInstance()返回的Object中包含的线程可以做些什么。
例如: 1.有没有办法使用这种技术实际保持后台线程运行? 2.当前一个Activity实例消失时,你是否需要以某种方式暂停线程,然后在新实例中再次重新启动它?
任何人都可以提供一个简短的例子吗?
任何细节都将不胜感激。
答案 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
引用(以避免任何相关的空指针)崩溃)。