0

我有一个线程以与常见的 Game Loop 编程模式非常相似的方式运行无限循环。线程(称为AudioScheduler)并MainActivity通过处理程序进行通信。我现在需要让应用程序MainActivityAudioScheduler继续运行时处理破坏和重新创建的配置更改。

有很多方法可以解决这个问题。看起来目前推荐的最佳方法是使用 API 演示中所示的 Retained Fragment 方法,并在Alex Lockwood 的优秀文章中进行了讨论。

在他的示例中,他通过使用接口有效地从他AsyncTask到他的一种方式进行通信。MainActivity在我的情况下,我需要 MainActivity 将 UI 更改传达给我的 AudioScheduler 线程,并且我的 AudioScheduler 线程也能够与 MainActivity 进行通信以告诉它对 UI 进行更新。

我已经使用处理程序来实现这一点,但它是最好的方法吗?它是否可以与 Retained Fragment 方法一起使用来进行配置更改?

我目前的沟通方式

在我的AudioScheduler线程中,我有;

  • 创建了一个处理程序audioSchedulerHandler
  • 创建了一个 getter 方法,以便 MainActivity 可以访问它:

        public Handler getHandler() {return audioSchedulerHandler;}
    
  • 使用了一个构造函数,该构造函数从 Parent 活动中获取一个处理程序,它可以用来与以下活动进行通信:

    public AudioScheduler(Handler parentHandler) {mParentHandler = parentHandler;}
    

在我的MainActivity我有;

  • 创建了一个处理程序mainHandler
  • 当我创建一个实例时将此传递给构造函数AudioScheduler
  • 在实例上使用了我的getHandler()方法,AudioScheduler以便可以与之通信。

任何时候我都需要重新建立这两种方式的通信MainActivity已经被破坏和重新创建。这应该怎么做?

setParentHandler(Handler parentHandler)我可以向AudioScheduler类添加一个方法,以便mParentHandler在创建线程对象后仍然可以重新分配我的方法。新创建的 MainActivity 也可以每次调用 getHandler() 方法,来获取AudioScheduler'shandler。但是什么时候应该调用这些?

修改 Alex Lockwood 的示例是否会覆盖MainActivity's onCreate 如下所示的内容,这会导致任何问题吗?

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    FragmentManager fm = getFragmentManager();
    mTaskFragment = (TaskFragment) fm.findFragmentByTag("audioSchedulerTask");

    if (mTaskFragment != null) {
      // Fragment is non-null, so it has been retained across a configuration change.

      // TODO: Use the getHandler() and setParentHandler() methods to re-establish communication.

    } else {
      // Fragment is null, so make a new one.

      mTaskFragment = new TaskFragment();
      fm.beginTransaction().add(mTaskFragment, "task").commit();
    }
  }
4

0 回答 0