【问题标题】:Activity's background thread & configuration changeActivity 的后台线程和配置更改
【发布时间】:2012-06-06 20:35:58
【问题描述】:

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

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

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

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

任何细节将不胜感激。

【问题讨论】:

    标签: android multithreading configuration android-activity orientation


    【解决方案1】:

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

    我们的想法是,您将在 Activity 的某处维护对您的线程的引用(通常是 AsyncTask),偶尔您的线程(同样,特别是如果它是 AsyncTask)将需要对Context 以便在其后台任务结束时执行某种 UI 更新。你需要确保你的线程引用的Context(以及任何从它派生的东西——比如TextView等)是非空的,否则它会崩溃。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • Activity启动的后台线程没有直接引用Activity或Context。当 Activity 创建线程时,它会将两个集合传递给线程将填充的线程。因此 Activity 和后台线程共享对这些集合的引用。后台线程解析 xml 文件并通过 Internet 加载图像。当线程在几秒钟后返回时,Activity 就可以从它传递给后台线程的两个集合中访问图像和其他数据。
      • 那你就没有问题了。线程只是继续做它的事情。您只需将旧活动的引用传递给新活动。
      • 其实我的后台线程确实引用了Activity。它目前是 Activity 的内部类,并在完成其后台工作时调用 Activity.runOnUiThread(...)。它在 UI 线程上运行的代码调用使用下载的图像来更新 View,并调用另一个调用来关闭 ProgessDialog。
      • 这可能是个问题(取决于你做事的方式)。我会想办法让 Activity 的新实例告诉线程将其回调(例如,不要使用内部类,或者使用静态内部类并将对 Activity 的引用传递给线程,如果创建了新的 Activity 实例,您可以稍后更改)。
      猜你喜欢
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多