1

我在这里看到了有关使用Activity.onRetainNonConfigurationInstance()来维护后台线程的一些讨论,该后台线程由Activity的一个实例启动并将其传递给Activity的下一个实例,例如,当手机的方向从纵向变为横向时。活动的后台线程和配置更改

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

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

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

任何细节,将不胜感激。

回答

2

你可以返回任何你想要的东西onRetainNonConfigurationInstance()。如果您有一个要从Activity的一个实例传递到另一个实例的线程,则可以直接返回它,或者将其放入另一个从onRetainNonConfigurationInstance()返回的对象中。您不需要暂停该线程或以任何方式与之交互。它就像一切都没有发生一样继续运行。

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

你想在后台线程中做什么?

编辑(增加约线程/活动的更多细节):

线程都有自己的生命周期,其从活动完全断开。如果您在活动中创建线程并启动线程,则无论您的活动如何,它都会运行完成。唯一能够明确停止线程的是Android决定终止进程(如果您的进程不包含活动活动,它可能会这样做)。

+0

由Activity启动的后台线程没有直接引用Activity或Context。当Activity创建线程时,它将两个集合传递给该线程将要填充的线程。所以Activity和后台线程共享对这些集合的引用。后台线程解析XML文件并通过互联网加载图像。当线程在几秒钟后返回时,活动可以访问它传递给后台线程的两个集合中的图像和其他数据。 – Ted

+1

然后你没有问题。线程只是继续做它的事情。您只需将旧活动的参考传递给新活动。 –

+0

其实我的后台线程确实参考了活动。它当前是活动的内部类,并在Activity.runOnUiThread(...)完成其后台工作时调用它。它在UI线程上运行的代码发出调用,以使用下载的图像更新视图并进行另一次调用以关闭ProgessDialog。 – Ted

0

线程将继续运行。举个例子,你可以用这个做什么,你可以看看android Ignition项目及其IgnitedAsyncTask(及相关示例)。

的想法是,你会在你的Activity保持对你的线程(通常是AsyncTask)引用某处,偶尔你的线程(再次,特别是如果它是一个AsyncTask)将需要一个Context一个参考,以便执行在完成其后台任务时进行某种UI更新。您需要确保线程引用的Context(以及从它派生的任何东西 - 如TextView等)非空,否则将崩溃。

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