2015-02-06 32 views
0

當你需要在loader#onLoadFinished更新UI,尤其是犯片段的交易,我看到無數的例子,當人們張貼一個可運行的,而不是直接執行,比如:裝載機onLoadFinished:發佈命令VS直接執行

更新:加載程序的回調在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 vs 2?

我敢打賭,它與避免片段的交易(以hideDilaog)發生的當前片段onSaveInstanceState後做,但我看不出方法1幫助在這種情況下。

它們基本上是否相同?

回答

0

如果您在UI線程中使用initLoader(),那麼onLoadFinished()也將在UI線程上運行,因此您可以立即執行hideDialog()。如果你從後臺線程初始化你的loader,那麼將會在這個後臺線程上運行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); 
} 
+0

對不起,我沒有提到一切都在UI線程上運行。我更新了這個問題。 – kiruwka 2015-02-06 10:16:21

+0

在這種情況下,我沒有看到選擇1的理由。有興趣看到其他評論和想法:) – Vesko 2015-02-06 10:24:18