我有一个线程以与常见的 Game Loop 编程模式非常相似的方式运行无限循环。线程(称为AudioScheduler
)并MainActivity
通过处理程序进行通信。我现在需要让应用程序MainActivity
在AudioScheduler
继续运行时处理破坏和重新创建的配置更改。
有很多方法可以解决这个问题。看起来目前推荐的最佳方法是使用 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();
}
}