Loader onLoadFinished:发布命令与直接执行

时间:2015-02-06 09:38:06

标签: android android-fragments android-loader

当您需要更新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如何帮助。

它们基本上是等同的吗?

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);
}
相关问题