配置更改后,在MainActivity和保留片段之间进行通信

时间:2013-10-12 06:07:06

标签: android multithreading orientation handler

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

有很多方法可以解决这个问题。看起来目前推荐的最佳方法是使用保留片段方法,如API演示中所示,并在Alex Lockwood's excellent article中讨论。

在他的例子中,他通过使用界面有效地从他的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的处理程序。但什么时候应该被称为?

修改Alex Lockwood的例子我会覆盖MainActivity on 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();
    }
  }

0 个答案:

没有答案