我有一個應用程序正在使用Loader
s得到一個數據庫,該數據庫也正在由IntentService
編輯。我通過LoaderCallbacks
實現接收來自Loader
的數據,該數據工作正常。是否有必要實現LoaderCallbacks和OnLoadCompleteListener以獲取ContentProvider中的更改通知?
我也使用ContentResolver#notifyChange(Uri, ContentObserver)
觸發重新加載。但是,這隻有在事先撥打Cursor#setNotificationUri(Uri)
時纔有效。
我能找到沒有提及任何文檔中的後一種方法,它似乎在事實上,這可能會導致崩潰:又見
然而,如果沒有對Cursor
的LoaderCallbacks#onLoadFinished(Loader<Cursor>, Cursor)
此調用僅在初始加載之後觸發,而不是在通知之後觸發。我是否也要需要實現一個OnLoadCompleteListener
來做,那麼,完全一樣的東西?
ContentProvider
查詢方法:
class MyContentProvider extends ContentProvider {
//...
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor query = db.query(getTableName(uri), projection, selection, selectionArgs, null, null, sortOrder);
query.setNotificationUri(getContext().getContentResolver(), uri);
return query;
}
//...
}
典型LoaderCallbacks
:
LoaderCallbacks<Cursor> mCallbacks = new LoaderCallbacks<Cursor>() {
@Override
public void onLoaderReset(Loader<Cursor> loader) {
mArticleAdapter.swapCursor(null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
if(cursor.isClosed()) {
Log.d(TAG, "CURSOR RETURNED CLOSED");
Activity activity = getActivity();
if(activity!=null) {
activity.getLoaderManager().restartLoader(mFragmentId, null, mCallbacks);
}
return;
}
mArticleAdapter.swapCursor(cursor);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
triggerArticleFeed();
CursorLoader cursorLoader = null;
if(id == mFragmentId) {
cursorLoader = new CursorLoader(getActivity(),
MyContentProvider.ARTICLES_URI,
null,
ArticlesContentHelper.ARTICLES_WHERE,
ArticlesContentHelper.ARTICLES_WHEREARGS,
null);
}
return(cursorLoader);
}
};
你可以發佈onLoadFinished方法嗎? – 2013-02-19 17:20:39
它是您自己的內容提供商或其他內容提供商嗎? – ebarrenechea 2013-02-19 17:21:35
@Saksak我已經把這些。 – 2013-02-19 17:22:42