Loader异步加载

来源:互联网 发布:单片机圆孔插座 编辑:程序博客网 时间:2024/05/22 03:04

使用CursorLoader查询加载数据:

1 获取LoaderManager:
manager=this.getLoaderManager();
2 实现LoaderCallBacks接口,重写其中三个方法:
onCreateLoader 创建Loader对象,返回对象与数据
onLoaderFinish 数据加载完毕之后调用的方法
onLoaderReset 当loader被重置之后调用的方法,之前的数据不可用
这些方法均运行在主线程中.
3初始化Manager:
manager.initLoader(100, null, this);
4触发事件,进行异步查询.

现在使用CursorLoader从数据库中查询联系人的信息,展现.
并且添加查询菜单,模糊查询姓名,重新加载数据展现.

菜单的xml文件:

 <item android:id="@+id/action_seach"   android:orderInCategory="100"   android:showAsAction="always"android:actionViewClass="android.widget.SearchView" /> 

然后为该菜单添加触发事件:

public boolean onCreateOptionsMenu(Menu menu) {    getMenuInflater().inflate(R.menu.main, menu);    MenuItem menuItem=menu.findItem(R.id.action_seach);    SearchView actionView=(SearchView) menuItem.getActionView();    actionView.setOnQueryTextListener(new OnQueryTextListener() {        // 文本提交的时候调用        @Override        public boolean onQueryTextSubmit(String query) {            // TODO Auto-generated method stub            return false;        }        //当文本改变的时候调用        @Override        public boolean onQueryTextChange(String newText) {            // TODO Auto-generated method stub            Bundle bundle=new Bundle();            if(newText!=null){                bundle.putString("keyword", newText);                /*                 * 重建loader,并且将数据传入给新建的loader                    */                manager.restartLoader(100, bundle, MainActivity.this);            }            return true;        }    });    return true;}

覆写的oncreate()方法: //返回loader与数据
// 返回null时会重新调用该方法,否则调用onLoaderfinish.

public Loader<Cursor> onCreateLoader(int id, Bundle bundle) {    if(bundle!=null){        String keyword=bundle.getString("keyword");        return new CursorLoader(this,Uri.parse(contact), new String[]{"_id","display_name"}, "display_name like ?", new String[]{"%"+keyword+"%"}, null);    }else{        return new CursorLoader(this,Uri.parse(contact),new String[]{"_id","display_name"},null,null,null);    }}

覆写onLoaderFinish:

public void onLoadFinished(Loader<Cursor> loader, Cursor data) {    // TODO Auto-generated method stub    //置换适配器中的游标并且重查数据,刷新界面    adapter.swapCursor(data);}

以上方法运行在主线程中,我们也可以自定义Loader
,查询数据:
//自定义的Loader必须声明为静态

   public static class MyAsyncTask extends AsyncTaskLoader<Cursor>{    private Bundle bundle;    public MyAsyncTask(Context context,Bundle bundle) {        super(context);        this.bundle=bundle;    }    @Override    protected void onStartLoading() {        // TODO Auto-generated method stub        super.onStartLoading();        //必须调用,否则无法执行下面方法        this.forceLoad();    }

// 完成之后,调用onLoaderFinish方法

    public Cursor loadInBackground() {        // TODO Auto-generated method stub        if(bundle!=null){            String keyword=bundle.getString("keyword");            return resolver.query(Uri.parse(contact), new String[]{"_id","display_name"}, "display_name like ?", new String[]{"%"+keyword+"%"}, null);        }else{            return resolver.query(Uri.parse(contact),new String[]{"_id","display_name"},null,null,null);        }    }}

函数的调用顺序
调用的顺序
oncreateLoader
执行异步操作
onLoaderFinish
deliverResult
* 销毁顺序:
onStopLoading
onLoaderReset

现在比较一下:
异步任务与异步加载之间的区别:

异步任务:
在 onPreExcute中执行预备操作
在 ondoInbackground中开启子线程执行任务
在onPostExceute将执行的结果返回到主线程中.
在子线程执行的过程中可以将执行的进度发送到主线程中,
onPublishProgress方法发布,在onProgressUpdate方法中接受到进度.
其本质是开启一个子线程,执行一项任务,并将任务的最终结果返回到主线程中.

异步加载:
在onCreateLoader中执行异步的查询,
在onLoadFinished中将查询的结果交给主线程.
在异步查询的时候,也是开启一个异步任务而已,只不过,这个异步任务是查询的任务.

0 0