我有一个线程运行无限循环,其方式与常见的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();
}
}