【问题标题】:Android: Resuming a paused Thread after an orientation changeAndroid:在方向更改后恢复暂停的线程
【发布时间】:2015-10-02 16:15:44
【问题描述】:

我有一个涉及线程和从方向变化中恢复的问题。我已经看到了很多涵盖线程或方向更改的出色答案,但涵盖两者的却很少。这是涵盖我的问题的一般场景:

  1. 应用启动,包含一个活动:一个 TextView 填充了变量“count”,最初为 0,一个 START 和一个 STOP 按钮。
  2. 开始按钮启动线程(使用线程),循环递增 数字并更新 TextView。
  3. 停止按钮设置布尔标志,因此线程退出。
  4. 所有变量都是全局变量和易失变量,用于控制线程的对象变量信号。

现在,处理方向变化的最佳方法是什么。我假设我:

  • 在onPause()中,我调用signal.wait()来暂停线程
  • 在 onSaveInstanceState() 上保存变量“counter”
  • 在 onResume() 中,我从 onRestoreInstanceState() 得到“计数器”

由于 onCreate() 将为“信号”创建一个新对象,我如何重新建立到当前正在等待() 的线程的链接,以便我可以调用 notify() 并恢复它?

我已尽我所能解释了这一点,我会尽力提供所要求的任何其他信息。

【问题讨论】:

  • 为什么不直接启动一个新线程并将计数器变量作为参数提供给它,以便它知道从哪里开始呢?您正确保存了 Activity 的状态,这样当一切重新开始时,您可以从中断的地方继续。所以只需重新启动线程,并告诉它计数器停止的位置(您在 savedInstanceState 中有)。
  • 谢谢@drschultz,这会奏效。我想知道最好的做法是什么。我知道当应用程序进入后台时,wait() 和 notify() 非常适合管理线程,我只是想知道我是否也可以使用它们来改变方向。
  • 在下面添加了答案。如果您认为它解决了您的问题,请接受它。谢谢!

标签: java android multithreading


【解决方案1】:

Activity 的生命周期被设计为可以根据系统需求或用户交互来销毁和重新创建,因此一般来说,当这些生命周期发生更改时,任何应用内操作也应该被销毁和重新创建。例外情况是在 Activity 之外的后台运行的长时间运行的进程(如服务)。

因此,要回答您的问题,与其尝试暂停和恢复线程,不如在 Activity 重新启动时简单地重新启动线程,并将您的计数器变量作为计数停止位置的指示器提供给线程。您已经将此变量保存在您的 savedInstanceState 中,因此只需在 Activity 开始时抓取它,然后将其传递到您的(新)线程以继续计数。

【讨论】:

  • 再次感谢@drschultz - 这就是我正在寻找的信息。
  • 一个例外是保留的片段可以在配置更改中持续存在。如果Thread(或者,最好是AsyncTask)存在于片段中,它也可以在配置更改后继续存在。如果它在配置更改的同时完成,则可以保证任何主线程回调都不会在旧活动的销毁和新活动的创建之间溜走。
  • @KevinKrumwiede 如果您保留一个 Fragment 并通过(我假设)onAttach() 跟踪其当前 Activity,这是否意味着即使您的应用程序长时间最小化,您的线程也会继续运行除了配置更改?我只是想知道,因为在特定于这个问题的“计数器”线程的情况下,使用这种方法似乎会导致你的 UI “跳转”到当前计数,因为你的计数器一直在后台运行(但不更新暂停的 UI 线程)。所以在那种情况下,保留的 Fragment 不会那么好用,对吗?
  • 正确。保留的片段仅用于在配置更改时保留内容;它们可能仍会在后台或后台堆栈中被销毁。为了区分配置更改和进入后台,您可以使用isChangingConfigurations(),如果它为 false,则取消后台处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多