2011-08-22 68 views
6

我的AsyncTaskLoader出現了一些問題,不確定它們是否相關,因爲它們都是在嘗試重新啓動加載程序時發生的。在我的應用程序中,我有3個自定義CursorAdapter實例,由3個由1個LoaderManager管理的自定義AsyncTaskLoader實例支持。的問題涉及兩個differenct適配器/裝載機對,但所使用的代碼是在各情況下是相同的:自定義AsyncTaskLoader回調的問題

getLoaderManager().restartLoader(loaderId, bundle, loaderManager); 

問題1:我請restartLoader()和LoaderManager寄存器onCreateLoader一個呼叫,但不是一個onLoaderReset()。 Loader獲取deliverResult(),但onLoadFinished()永遠不會被調用。 Loader沒有設置「重置」或「啓動」標誌(見下面的代碼)。

問題2:我調用restartLoader()並且LoaderManager註冊一個對onLoaderReset()的調用。 Loader獲取onReset(),但沒有更進一步。遊標設置爲空,但沒有加載新的遊標。

任何想法可能是什麼問題?下面是一些用於裝載機和裝載機經理代碼:

CustomCursorLoader.java

@Override 
protected void onStartLoading() { 
    Log.v(TAG, "Starting Loader"); 
    if (lastCursor != null) { 
     deliverResult(lastCursor); 
    } 
    if (takeContentChanged() || lastCursor == null) { 
     forceLoad(); 
    } 
} 

@Override 
public void deliverResult(Cursor cursor) { 
    Log.v(TAG, "Delivering result"); 
    if (isReset()) { 
     Log.v(TAG, "reset"); 
     if (cursor != null) { 
      cursor.close(); 
     } 
     return; 
    } 
    Cursor oldCursor = lastCursor; 
    lastCursor = cursor; 
    if (isStarted()) { 
     Log.v(TAG, "started"); 
     super.deliverResult(cursor); 
    } 
    if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { 
     oldCursor.close(); 
    } 
} 

@Override 
protected void onReset() { 
    Log.v(TAG, "Reset"); 
    super.onReset(); 
    onStopLoading(); 
    if (lastCursor != null && !lastCursor.isClosed()) { 
     lastCursor.close(); 
    } 
    lastCursor = null; 
} 

CustomCursorLoaderManager.java:

@Override 
public Loader<Cursor> onCreateLoader(int loaderId, Bundle bundle) { 
    return new CustomCursorLoader(); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { 
    cursorAdapter.changeCursor(cursor); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    cursorAdapter.changeCursor(null); 
} 

回答

1

你所說的'LoaderManager'實際上是LoaderManager.LoaderCallbacks<D>接口的實現。您可能想要使用不同的名稱,這是令人困惑的。爲什麼是單身人士?它通常與Activity或Fragment綁定,可能只是實現接口的Activity/Fragment。你在哪裏創建你的裝載機(活動/片段)?另外請確保您從onCreate()/onActivityCreated()撥打LoaderManager.initLoader(),否則裝載機可能無法正常啓動。

+0

1.是的,我知道這個名字不清楚,對不起。 2.它不再是單身人士 - 一直在那部分工作 3.我遇到的主要問題是我希望能夠使用相同的遊標在不同的片段中使用相同的遊標並綁定到不同的活動 – Pikaling

+0

爲什麼你想分享遊標嗎?這可能不是一個好主意:加載程序由活動/碎片管理,因此當另一個活動結束時,加載程序可能會關閉。您可以使用相同的Loader _class_,並使其在不同的活動/片段中實例化。 –

+0

感謝您的幫助。我完成了所有代碼並重寫了所有代碼,現在所有代碼都已經工作。有時候我討厭OOP ... – Pikaling

0

當你創建一個光標,並在數據庫點它,你不能將其設置爲null。你必須明確地關閉遊標,否則它會鎖定數據庫直到它超時。

我建議您利用Android生命週期和您現有的回調來實現此修復。

希望這會有所幫助!

+0

良好的捕獲 - 這應該是changeCursor()不swapCursor() - 我已經改變了,現在 – Pikaling

+0

你仍然有同樣的問題? – Codeman

+0

不,我試圖修復它,並使其變得更糟!總是這樣... – Pikaling