2014-06-08 18 views
4

我有一個CursorLoader,它向ListFragment提供數據。我已經通知機制正確地在我ContentProvider配置有:當活動暫停時取消光標加載器

cursor.setNotificationUri(getContext().getContentResolver(), uri); 

getContext().getContentResolver().notifyChange(uri, null) 

當我選擇列表項目,一個新的子Activity被打開,在此Activity我做的onCreate()查詢修改項目詳細信息。

我知道通知被解僱,CursorLoader重新查詢內容提供者。

我現在面臨的問題是,有時CursorLoader被取消,因爲父Activity被暫停(或停止)和onLoadFinished()不會被調用。

CursorLoader被取消,即使我重新初始化的ListFragment的裝載機onResume(),我不能看到數據中的任何改變:

@Override 
public void onResume() { 
    super.onResume(); 
    getLoaderManager().initLoader(URL_LOADER, null, this); 
} 

我使用支持庫V4。

我假設CursorLoader更新了父母Activity,即使它在後臺。 ListFragment恢復時是否需要重新啓動加載程序?

(編輯)

我忘了提,我創建和啓動從ListFragment裝載機。

經過一番調試後,我發現當ListFragment停止時,加載器管理器會取消該片段的所有當前加載器。

就我而言,當創建新的子活動時,db更改會觸發一個通知,使加載程序執行重新查詢。如果查詢在父代片段停止前未完成,則加載器將被取消,並且舊遊標仍然有效。當我從子活動導航回到此父活動並帶有ListFragment時,顯示的數據來自舊遊標。在這種情況下,通知丟失了,我必須重新啓動加載程序onResume()

我做了一個測試,只是在孩子活動開始後的10秒後修改了數據庫,並且因爲加載程序沒有被取消(因爲父活動已經停止),所以當我返回父活動時收到一個新的遊標。

每當家長活動恢復時,任何人都可以幫助我找到一種不涉及強制重新查詢(restartCursor())的解決方案嗎?

+0

您何時打電話給.notifyChange? – pskink

+0

@pskink在ContentProvider當我改變我的ListFragment的項目。這發生在onCreate()中的子活動中。 –

+0

確定什麼標誌你在一個CursorAdapter使用?我使用的是相同的機制和通知都不會丟失 – pskink

回答

0

使用支持庫時,您需要使用getSupportLoaderManager()而不是getLoaderManager(),但是您只能從FragmentActivity中獲取它。因此請嘗試使用此代碼:

getActivity().getSupportLoaderManager().initLoader(id, null, this); 
+0

我試過這種方法,但行爲是一樣的。當孩子活動開始時,加載器被取消。 –

+0

每個活動只有一個LoaderManager,並且LoaderManager將加載程序與其創建組件的生命週期關聯起來,因此,如果您試圖在活動之間共享加載程序,則無法完成。 – ILovemyPoncho