LoaderManager的使用,替代傳統的ContentResolver查詢。

最近在閱讀google samples 的時候發現項目裏查詢聯繫人並不是按照我以前寫的方式實現到,要是我寫到話應該就是


getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);

然後在得到Cursor,再去遍歷…

但是發現google developer使用到是一個CursorLoader和LoaderManager來實現到的,看了一下,代碼比我以前寫的這種方式更加清晰,簡潔,然後就去看了一下官方介紹。

LoaderManager這個東西,在我們的activity和fragment中,都存在唯一的一個LoaderManager對象,我們可以通過getLoaderManager來獲取這個對象。由LoaderManager來管理一個或多個Loader的啓動、停止、保持、重啓、關閉,這些都由LoaderManager來處理,通過LoaderCallbacks接口來監聽Loader到變化。

Loader又是什麼,它監聽底層數據源,當數據發生改變時重新加載,activity切換的時候不會影響數據。它有一個子類是AsyncTaskLoader,當看到AsyncTask的時候就已經差不多明白了,這個類內部有一個AsyncTask來處理異步操作,而查詢聯繫人用到的就是CursorLoader就是AsyncTaskLoader的子類,當然我們也可以自己繼承它來根據自己的需求來自定義。

啊,,還是寫代碼來看一下怎樣使用比較直觀一點。

//實現LoaderCallbacks接口
public class LoaderTestFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_test,container,false);
        //LoaderManager與當前的Loader關聯進行查詢操作
        loadImages();
        return rootView;
    }

    private void loadImages(){
        getLoaderManager().restartLoader(0,null,this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        //這裏查詢內存卡中的圖片
        return new CursorLoader(getActivity(), MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,null,null,null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
        if (data != null){
            //獲取到數據到時候進行操作
        }
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        //重置數據
    }
}

主要就是
getLoaderManager().restartLoader(0,null,this);這個方法需要三個參數:
id是一個標識符,方便我們在調用destroyLoader的時候知道需要銷燬哪個Loader。
args是可選的,就是在調用onCreateLoader()方法中到bundle,你可以根據傳不同到參數來判斷然後加載不同到數據
callback就是我們到LoaderCallback回調。

我們需要在實現LoaderCallback接口的時候指定數據的格式
然後在onLoadFinished()得到數據進行處理。

使用起來就是這麼簡單,而且還不用擔心各種生命週期的麻煩,這些LoaderManager都會自己處理,而我們只需要關心回調函數中做我們的操作就ok了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章