Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Loader 技術的簡單實用

Android Loader 技術的簡單實用

編輯:關於Android編程

從Android3.0開始,Android SDK提供了Loader技術,使用Loader技術可以很容易進行數據的異步加載。Loader技術為我們提供的核心類有:

  • LoaderManager:可以通過Activity或者的Fragment的getLoaderManager()方法得到LoaderManager,用來對Loader進行管理,一個Activity或者Fragment只能有一個LoaderManager。
  • LoaderManager.LoaderCallbacks:用於同LoaderManager進行交互,可以在其中創建Loader對象。
  • AsyncTaskLoader:抽象類,可以進行異步加載數據的Loader,貌似內部也是通過AsynTask實現的,可以通過繼承它構建自己的Loader,也可以使用現有的子類,例如異步查詢數據庫可以使用CursorLoader。

    使用Loader一般可以經過以下步驟:

    1、初始化Loader,可以使用initLoader(intid, Bundle args, LoaderManager.LoaderCallbacks callback);方法進行初始化。
    id:標識Loader的ID,一個Activity或者Fragment只能有一個LoaderManager,但可以有多個Loader,通過ID區 分。在新建Loader時,如果發現已經有相同ID的Loader就會復用該Loader,而不會重新創建。
    args:傳給新建Loader的參數。

    Callback:回調接口。


    2、實現LoaderManager.LoaderCallbacks中的方法,LoaderManager.LoaderCallbacks中需要實現的方法有:
    publicLoader onCreateLoader(int id, Bundle args):創建新的Loader,id為LoaderID,如果已經有相同ID的Loader就會復用該Loader,而不會重新創建。 args為初始化時傳遞的參數。該方法開始異步查詢,並返回一個泛型類,如果是查詢數據庫可以返回一個CursorLoader,可以返回自定義的Loader。public voidonLoadFinished(Loader loader, D data):異步查詢結束的會調用這個方法,並返回查詢結果 data。public void onLoaderReset(Loader loader): 當調用Loader.reset()將Loader數據清空時,但在系統銷毀Loader時會自動調用Loader.reset()方法,我們一般不需要手動調用,只需要在onLoaderReset方法中,將使用Loader的移除。

    3、使用 restartLoader(intid, Bundle args, LoaderManager.LoaderCallbacks callback)方法進行數據更新,和初始化一個,如果有相同id的Loader存在,會復用Loader,並清空原有Loader中的數據,如果沒有就新建一個。這個方法一般使用在需要更新數據時,例如下面例子中,在搜索關鍵改變時,需要調用這個方法,從新異步查詢數據。


    下面一個例子使用CursorLoader查詢聯系人名字,並顯示在ListActivity中,在ActionBar上放置了一個SearchView可以根據聯系人姓名關鍵字查詢聯系人。

    Activity代碼如下:

    public class MainActivity extends ListActivity implements LoaderManager.LoaderCallbacks, SearchView.OnQueryTextListener {
    private  SimpleCursorAdapter cursorAdapter;
        private String filterName=null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView tv= (TextView) findViewById(android.R.id.empty);
            tv.setText("請稍後");
    
            cursorAdapter=new SimpleCursorAdapter(this,
                    android.R.layout.simple_list_item_2,
                    null,
                    new String[]{ContactsContract.Contacts.DISPLAY_NAME},
                    new int[]{android.R.id.text1},0);
             setListAdapter(cursorAdapter);
            //初始化Loader
              getLoaderManager().initLoader(0,null,this);
        }
    
    
        @Override
        public Loader onCreateLoader(int id, Bundle args) {
            Uri uri;
            String[] pro=new String[]{ ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts._ID};
            if(TextUtils.isEmpty(filterName)){
                uri= ContactsContract.Contacts.CONTENT_URI;
            }else{
                uri=Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI,Uri.encode(filterName));
            }
            //創建Loader對象,開始異步加載數據
            return new CursorLoader(this,uri,pro, null, null,null);
        }
    
        @Override
        public void onLoadFinished(Loader loader, Cursor data) {
            //得到異步加載數據,更新Adapter
            cursorAdapter.swapCursor(data);
        }
    
        @Override
        public void onLoaderReset(Loader loader) {
            //移除adapter使用的Loader,系統會釋放不再使用的Loader
            cursorAdapter.swapCursor(null);
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu_main,menu);
            SearchView v= (SearchView) menu.findItem(R.id.menu_search).getActionView();
            v.setOnQueryTextListener(this);
            return true;
        }
    
        @Override
        public boolean onQueryTextSubmit(String query) {
            return true;
        }
    
        @Override
        public boolean onQueryTextChange(String newText) {
            filterName=newText;
            //使用新的Loader(清空舊的數據)
            getLoaderManager().restartLoader(0,null,this);
            return false;
        }
    }

    菜單資源文件:

    
        
    

    最後來個效果圖:




    1. 上一頁:
    2. 下一頁:
    熱門文章
    閱讀排行版
    Copyright © Android教程網 All Rights Reserved