1

我在 Stack Overflow 上看到了一些关于使用 Activity.onRetainNonConfigurationInstance() 来维护由 Activity 的一个实例启动的后台线程并将其传递给 Activity 的下一个实例的讨论,例如,当手机的方向发生变化时从纵向到横向。

讨论并没有具体说明包裹在从 onRetainNonConfigurationInstance() 返回的 Object 中的线程可以做什么。

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

谁能提供一个简短的例子?

任何细节将不胜感激。

4

2 回答 2

2

您可以退回任何您想要的东西onRetainNonConfigurationInstance()。如果你有一个 Thread 想要从 Activity 的一个实例传递到另一个实例,你可以直接返回它,或者将它放在另一个你从中返回的对象中onRetainNonConfigurationInstance()。您无需暂停线程或以任何方式与其交互。它只是继续运行,好像什么都没发生一样。

您唯一需要关心的是线程如何与活动交互(如果有的话)。如果线程将回调 Activity(以指示进度或类似的东西),那么您需要以某种方式为线程提供对新 Activity 的引用,因为旧的 Activity 将失效。

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

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

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

于 2012-06-01T15:26:32.050 回答
0

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

这个想法是你将AsyncTask在你的某个地方维护对你的线程(通常是一个)的引用Activity,并且偶尔你的线程(再次,特别是如果它是一个AsyncTask)将需要一个对 a 的引用Context,以便在结束时执行某种 UI 更新其后台任务。您需要确保您的线程引用的Context(以及从它派生的任何东西——如 aTextView等)是非空的,否则它将崩溃。

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

于 2012-06-01T15:32:19.467 回答