2015-05-21 16 views
0

具有片段等的下方,在正常流動的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的監視是如何正確的。也許有更好的方法呢? 任何建議表示讚賞。

+0

哪裏是你的內容提供商? – mmlooloo

+0

你想忽略第一個畢竟onLoadFinished電話? –

+0

https://stackoverflow.com/questions/21623714/what-is-cursor-setnotificationuri-used-for有幫助。 – lannyf

回答

1

如果要停止加載,你可以使用:

getLoaderManager().destroyLoader(LOADER_ID);