Loader的使用

Loader的使用

 

1. 初始化

private void initMyLoader() {

       getLoaderManager().initLoader(0, null, mLoader);

    }

初始化Loader,可以使用initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);方法进行初始化。

id:标识Loader的ID,一个Activity或者Fragment只能有一个LoaderManager,但可以有多个Loader,通过ID区分。在新建Loader时,如果发现已经有相同ID的Loader就会复用该Loader,而不会重新创建。
args:传给新建Loader的参数。

Callback:回调接口。

2. 实现一个加载器

    /**

     * 实现一个加载器

     *

     * @author Administrator

     *

     */

    private class MyLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {

 

       @Override

       public Loader<Cursor> onCreateLoader(int id, Bundle args) {

           // TODO Auto-generated method stub

          当一个新的loader需被创建时调用,进行数据库访问操作,结果返回

           m_FinishLoaderFlag = false;

           CursorLoader cursor = new CursorLoader(MainActivity.this,

                  CallLog.Calls.CONTENT_URI, CALLLOG_PROJECTION, null, null,

                  CallLog.Calls.DEFAULT_SORT_ORDER);

           Log.d(TAG, "MyLoaderListener---------->onCreateLoader");

           return cursor;

       }

 

       @Override

       public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

           // TODO Auto-generated method stub

         当loader加载数据完成后执行的操作,主要是对数据的处理,展现

       }

 

       @Override

       public void onLoaderReset(Loader<Cursor> loader) {

           // TODO Auto-generated method stub

           当一个已创建的加载器被重置从而使其数据无效时,此方法被调用。此回调使你能发现什么时候数据将被释放于是你可以释放对它的引用。

       }

    }

3. 数据更新restartLoader

使用 restartLoader(int id, Bundle args, LoaderManager.LoaderCallbackscallback)方法进行数据更新,和初始化一个,如果有相同id的Loader存在,会复用Loader,并清空原有Loader中的数据,如果没有就新建一个。这个方法一般使用在需要更新数据时,例如下面例子中,在搜索关键改变时,需要调用这个方法,从新异步查询数据。


完整案例:

 

public class MainActivity extends ListActivity implements LoaderManager.LoaderCallbacks<cursor>, 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<cursor> 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<cursor> loader, Cursor data) {

        //得到异步加载数据,更新Adapter

        cursorAdapter.swapCursor(data);

    }

 

    @Override

    public void onLoaderReset(Loader<cursor> 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;

    }

 

转载于:https://my.oschina.net/reborn87/blog/482860

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值