具有片段等的下方,在正常流動的onCreateLoader和onLoadFinished被稱爲成對。 但是,當數據源(數據庫)內容發生變化時,並且由於加載程序正在監視數據更改,加載程序將使用遊標中填充的新數據向onLoadFinished()發出另一個調用。 但對我來說它並不想改變當前正在使用的遊標,所以不想裝載機交付更新光標對另一onLoadFinished呼叫,或禁用加載器的監控部分。如何防止cursorLoader調用到onLoadFinished如果是監測數據的變化
有沒有辦法做到這一點?
AFragment extends Fragment implements LoaderCallbacks<Cursor> {
protected void startSupportLoaderManager() {
getActivity().getSupportLoaderManager()
.initLoader(LOADER_ID, null, this);
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return createLoader(getActivity(), id, args, null);
}
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
if (mAdapter != null) {
mAdapter.resetCursor();
}
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
...
}
}
編輯: 還挺知道這可能工作,但感覺還是缺少一些點。這裏是思想: 在ContentProvider的實施,對於插入(),更新(),刪除(),我們做
getContext().getContentResolver().notifyChange(uri, null);
而在CursorLoader它確實cursor.registerContentObserver(mObserver);在
public Cursor loadInBackground() {
Cursor cursor = getContext().getContentResolver().query(mUri, mProjection, mSelection,
mSelectionArgs, mSortOrder);
if (cursor != null) {
// Ensure the cursor window is filled
cursor.getCount();
cursor.registerContentObserver(mObserver);
}
return cursor;
}
因此,以某種方式被監測的Uri數據源的變化,同樣的,我們做光標 cursor.setNotificationUri(的getContext()getContentResolver(),URI);所以如果我們可以提供一個Uri,它可以用於插入/更新/刪除,但是與Uri不同,我們給Loader,那仍然會執行惰性/更新/刪除操作,但是加載器不會因爲URI的通知是不同的。 所以基本上,加載程序將使用不同的烏里比使用其他數據操作的URI。
不確定是否理解Loader對內容Uri的監視是如何正確的。也許有更好的方法呢? 任何建議表示讚賞。
哪裏是你的內容提供商? – mmlooloo
你想忽略第一個畢竟onLoadFinished電話? –
https://stackoverflow.com/questions/21623714/what-is-cursor-setnotificationuri-used-for有幫助。 – lannyf