当您需要更新loader#onLoadFinished
中的UI,特别是提交片段事务时,我看到了很多例子,当人们发布runnable而不是直接执行时,例如:
更新:加载器的回调在UI线程上运行。
1
public void onLoadFinished(Loader<Void> loader, Void result) {
mHandler.post(new Runnable() {
@Override public void run() {
hideDialog();
}
});
}
VS
2
public void onLoadFinished(Loader<Void> loader, Void result) {
hideDialog();
}
其中hideDialog
执行一些片段事务:
private void hideDialog() {
FragmentTransaction ft = getFragmentManager().beginTransaction();
Fragment prev = getFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev).commit();
}
}
更喜欢方法1对2的原因是什么?
我敢打赌它与避免片段事务(在hideDilaog
中)发生在当前片段onSaveInstanceState
之后发生有关,但我不知道在这种情况下方法1如何帮助。
它们基本上是等同的吗?
答案 0 :(得分:0)
如果您从UI线程initLoader()
,那么onLoadFinished()
也将在UI线程上运行,因此您可以立即执行hideDialog()
。如果你从后台线程初始化你的加载器,那么onLoadFinished()
将在这个后台线程上运行,因此你需要一个处理程序。
因此,如果您正在编写自己的自定义加载程序,而您不确定将如何启动(例如,如果它们是某些库的一部分),那么它是个好主意onLoadFinished()
Runnable refreshUI = new Runnable() {
@Override
public void run() {
// refresh UI elements here
}
};
if (Thread.currentThread() == Looper.getMainLooper().getThread()) {
// you're directly on the UI thread, so just run the runnable
refreshUI.run();
} else {
// on a background thread, use a handler
handler.post(refreshUI);
}