2012-04-04 81 views
3

我正在使用LoaderManager來處理支持列表視圖的查詢。它依賴於一些參數,但直到後來才知道。目前我打電話延遲加載程序管理的查詢的最佳方式是什麼?

getSupportLoaderManager().initLoader(0, null, callback); 

在onCreate()。在參數全部已知之前,這將立即創建加載器並執行查詢。爲了處理這個問題,我在onCreateLoader()中有一個虛擬查詢,當並非所有的參數都已知時,我的回調處理程序中會檢查onLoadFinished()是否有合法查詢。如果不是,我忽略遊標數據。當談到時間做一個真正的查詢,我叫

getSupportLoaderManager().restartLoader(0, null, callback); 

,也可以設置自己的旗幟爲true,使onLoadFinshed()正確處理它。

我在上面做的事情看起來有點兒怪異;有沒有更好的辦法?我最初嘗試在以後需要查詢時調用initLoader(),但隨後在方向更改時失敗,類似於this question

+1

答案可能是:不要使用'Loader'。使用別的東西來將工作移動到背景,比如'AsyncTask'。 – CommonsWare 2012-04-04 22:13:19

+0

我很害怕這個。雖然我可能仍然可以使用加載程序而不使用片段特定的LoaderManagers,但是如果我可以推遲片段的創建... – qix 2012-04-11 08:20:49

+0

仍然hacky,但是如果您的虛擬查詢不返回任何行,則不需要onLoadFinished中的標誌(' SELECT * from sqlite_master LIMIT 0' - thanks matt))或者你有一個CursorLoader子類,比如EmptyCursorLoader,它涵蓋了你 – Dori 2012-07-10 14:08:41

回答

0

只是爲了解決這個問題,對於我的用例,我能夠依靠使用per-fragment加載器管理器,在我需要它們並獲取信息時實例化這些問題。如果這不適合其他人的用例,那麼如果您想避免編寫AsyncTasks並利用加載程序的某些內置功能,那麼也許我的原始黑客就夠用了。

0

您可以直接致電restartLoader,而無需先致電initLoader。只需從onCreate中刪除initLoader的呼叫,並在您有參數後運行restartLoader,無需標誌。

+0

所以這實際上工作時getSupportLoaderManager()。enableDebugLogging(true),但失敗時,這是錯誤的,我做了一個旋轉。當我旋轉回來時,出現錯誤「未啓動時調用doRetain:LoaderManager」。 – qix 2012-04-11 08:17:59

+0

在ICS上我也一樣 - 目前看起來沒有問題 – Dori 2012-07-10 12:37:09

+0

@qix:如果你在onResume而不是onCreate裏面調用initLoader/restartLoader,你仍然需要在onCreate裏面調用getLoaderManager/getSupportedLoaderManager來正確初始化加載器管理器。 – 2015-05-26 09:26:41

0

我發現了另一個更簡單的解決方案。出於某種原因,您必須在onCreate()中調用initLoader(),但是因爲每次調用restartLoader()時都必須傳遞LoaderCallbacks,所以在第一次對initLoader進行的虛擬調用中使用了哪些回調函數( )。我創建了非常簡單的實用方法:

public static void initEmptyLoaders(Activity activity, int... ids) { 
    initEmptyLoaders(activity, activity.getLoaderManager(), ids); 
} 

public static void initEmptyLoaders(final Context ctx, LoaderManager loaderManager, int... ids) { 
    LoaderManager.LoaderCallbacks callbacks = new LoaderManager.LoaderCallbacks() { 
     @Override 
     public Loader onCreateLoader(int i, Bundle bundle) { 
      return new Loader(ctx); 
     } 

     @Override 
     public void onLoadFinished(Loader loader, Object o) { 
     } 

     @Override 
     public void onLoaderReset(Loader loader) { 
     } 
    }; 

    for (int id : ids) { 
     loaderManager.initLoader(id, null, callbacks); 
    } 
} 

現在我打電話initEmptyLoaders()在我的onCreate()與每一個加載器的ID我以後可能會需要 - 一切正常:-)

0

這是一個老問題,比仍然存在於某些機器人中,並且支持庫更新。然後使用Loader API的android.support.v4.*版本來修復它。

相關問題