Java Android:在方向更改后恢复暂停的线程

Java Android:在方向更改后恢复暂停的线程,java,android,multithreading,Java,Android,Multithreading,我有一个问题涉及到线程和从方向改变中恢复。我已经看到了许多涵盖线程或方向变化的伟大答案,但很少有人同时涵盖这两个方面。下面是一个涵盖我的问题的一般场景: 应用程序启动时,包含一个活动:一个文本视图填充变量“count”,最初为0,一个开始和一个停止按钮 开始按钮启动线程(使用线程),循环递增 号码和更新文本视图 停止按钮设置布尔标志,使线程退出 所有变量为全局变量和可变变量,对象变量信号用于控制线程 现在,处理方向变化的最佳方式是什么。我假设我: 在onPause()中,我调用signal.w

我有一个问题涉及到线程和从方向改变中恢复。我已经看到了许多涵盖线程或方向变化的伟大答案,但很少有人同时涵盖这两个方面。下面是一个涵盖我的问题的一般场景:

  • 应用程序启动时,包含一个活动:一个文本视图填充变量“count”,最初为0,一个开始和一个停止按钮
  • 开始按钮启动线程(使用线程),循环递增 号码和更新文本视图
  • 停止按钮设置布尔标志,使线程退出
  • 所有变量为全局变量和可变变量,对象变量信号用于控制线程
  • 现在,处理方向变化的最佳方式是什么。我假设我:

    • 在onPause()中,我调用signal.wait()暂停线程
    • 在onSaveInstanceState()上保存变量“counter”
    • 在onResume()中,我从onRestoreInstanceState()获取“计数器”
    由于onCreate()将为“信号”创建一个新对象,我如何重新建立到当前正在等待()的线程的链接,以便调用notify()并恢复它


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

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


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

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


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

    为什么不启动一个新线程并将计数器变量作为参数提供给它,以便它知道从何处开始?您可以正确地保存活动的状态,以便在一切重新启动时,您可以从停止的地方重新开始。因此,只需重新启动线程,并告诉它计数器停止的位置(您在savedInstanceState中有计数器)。谢谢@drschultz,这样就行了。我想知道最好的做法是什么。我知道wait()和notify()非常适合在后台运行应用程序时管理线程,我只是想知道是否可以将它们用于方向更改。下面添加了一个答案。如果你觉得它解决了你的问题,请接受它。谢谢为什么不启动一个新线程并将计数器变量作为参数提供给它,以便它知道从何处开始?您可以正确地保存活动的状态,以便在一切重新启动时,您可以从停止的地方重新开始。因此,只需重新启动线程,并告诉它计数器停止的位置(您在savedInstanceState中有计数器)。谢谢@drschultz,这样就行了。我想知道最好的做法是什么。我知道wait()和notify()非常适合在后台运行应用程序时管理线程,我只是想知道是否可以将它们用于方向更改。下面添加了一个答案。如果你觉得它解决了你的问题,请接受它。谢谢再次感谢@drschultz-这就是我要寻找的信息。一个例外是保留的片段可以在配置更改中持久化。如果
    线程
    (或者,最好是
    异步任务
    )存在于片段中,那么它也可以在配置更改后存活。如果它与配置更改几乎同时完成,则可以保证任何主线程回调都不会在旧活动的销毁和新活动的创建之间滑动。@KevinKrumwiede如果您保留一个片段并通过(我假定)onAttach()跟踪其当前活动,这是否意味着,除了配置更改外,即使应用程序长时间最小化,线程也会继续运行?我只是想知道,在这个问题的“计数器”线程的情况下,似乎使用这个方法会导致您的UI“跳转”到当前计数,因为您的计数器一直在后台运行(但没有更新暂停的UI线程)。所以在这种情况下,保留的片段不会很好地工作,对吗?对。保留的片段只是为了在配置更改中保留内容;它们仍可能在后台或后台被销毁。为了区分配置更改和进入后台,如果它为false,您可以使用并取消后台处理。再次感谢@drschultz-这就是我要查找的信息。例外情况是,保留的片段可以在配置更改中保留。如果
    线程
    (或者,最好是
    异步任务
    )存在于片段中,那么它也可以在配置更改后存活。如果它大约在配置更改的同一时间完成,则可以保证任何主线程回调