我的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.是的,我知道這個名字不清楚,對不起。 2.它不再是單身人士 - 一直在那部分工作 3.我遇到的主要問題是我希望能夠使用相同的遊標在不同的片段中使用相同的遊標並綁定到不同的活動 – Pikaling
爲什麼你想分享遊標嗎?這可能不是一個好主意:加載程序由活動/碎片管理,因此當另一個活動結束時,加載程序可能會關閉。您可以使用相同的Loader _class_,並使其在不同的活動/片段中實例化。 –
感謝您的幫助。我完成了所有代碼並重寫了所有代碼,現在所有代碼都已經工作。有時候我討厭OOP ... – Pikaling