Android异步加载数据--Loader

来源:互联网 发布:旅游分销系统源码 编辑:程序博客网 时间:2024/05/17 03:30
一, 什么是Loader

    Loader 是android 3.0后出现, 它可以使Activity和Fragment异步加载数据变得简单

二,  Loader的主要的作用  

   他对每个Activity和Fragment都是有效的

    他通过异步的方式加载数据

    他有一个系统感知的机制, 当数据源发生变化时, 会及时通知.也就是说可以监听数据源的变化, 一旦数据源发生变化后, Loader就会感知到这些变化
    实时刷新数据, 当Cursor中数据发生变化时, ListView自动刷新
  三, loader使用的核心类
    LoaderManager
       作用: 
        1, 初始化启动Loader,  无条件
            initLoader(编号, 查询条件, 回调接口)
        2, 重启Loader, 有条件
            restartLoader(编号, 查询条件, 回调接口)
       注意:
        1, 一个Activity和Fragment中只能有一个LoaderManager, 而一个LoaderManager可以管理多个Loader
        2, 在启动Loader时, 必须要提供一个回调接口, 即LoaderCallBacks接口
    LoaderCallBacks  回调接口
        重写3个方法
        1, 创建新的Loader的方法
            onCreateLoader(int id,Bundle args)
            {
                return  new CursorLoader(...);
            }
        2, Loader加载数据完成
            onLoaderFinished(Loader<Cursor> loader, Cursor data)
            {
                //adapter.swapCursor(data);
                adapter.changeCursor(data);// 多了一个关闭Cursor的操作
            }
        3, 在创建新的Loader之前, 重置之前Loader加载的数据
            onLoaderReset(Loader<Cursor> loader)
            {
            
                //adapter.swapCursor(null);
                adapter.changeCursor(null);// 多了一个关闭Cursor的操作
            }
    CursorLoader
        CursorLoader 内部使用了CotentResolver 加载ContentProvider暴露出来的数据,通过URI
        内置CotentObserver,监听数据源的变化

 AsyncTaskLoader<D>   自定义的Loader
        1, 定义一个类, 继承AsyncTaskLoader<D> ,声明返回结果的类型
        2, 重写方法 onStartLoading()  , 执行方法: forceLoader()强制执行后台的方法, 加载数据
        3, 重写父类的方法 loadInBackground() , 在此方法中执行获取数据的操作, 并将结果返回

        4, 构造方法

查询联系人实例:

public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {private ListView lv;private EditText edit;private Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;private String[] columns = { ContactsContract.CommonDataKinds.Phone._ID,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER };private SimpleCursorAdapter adapter = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv = (ListView) findViewById(R.id.lv);edit = (EditText) findViewById(R.id.edit);edit.addTextChangedListener(new TextWatcher() {@Overridepublic void onTextChanged(CharSequence s, int start, int before,int count) {// TODO Auto-generated method stub}@Overridepublic void beforeTextChanged(CharSequence s, int start, int count,int after) {// TODO Auto-generated method stub}@Overridepublic void afterTextChanged(Editable s) {// TODOBundle b = new Bundle();b.putString("key", s.toString());getLoaderManager().restartLoader(1, b, MainActivity.this);}});getLoaderManager().initLoader(1, null, this);adapter = new SimpleCursorAdapter(this, R.layout.item, null,new String[] {ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER },new int[] { R.id.textView1, R.id.textView2 },SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);lv.setAdapter(adapter);}@Overridepublic Loader<Cursor> onCreateLoader(int id, Bundle args) {// TODO 创建新的loader 加载相应的数据// 创建一个对象 加载数据 并且返回// CursorLoader loader = new CursorLoader(this, uri,// columns, null, null,// null);String selection = null;String[] selectionArgs = null;if (args != null) {selection = ContactsContract.CommonDataKinds.Phone.NUMBER+ " like ? ";selectionArgs = new String[] { "%" + args.getString("key") + "%" };}CursorLoader loader = new CursorLoader(this, uri, columns, selection,selectionArgs, null);return loader;}@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {// TODO Loader数据加载结束adapter.changeCursor(data);}@Overridepublic void onLoaderReset(Loader<Cursor> loader) {// TODO Auto-generated method stub// 清除旧数据adapter.changeCursor(null);}}

自定义实例:

public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {private ListView lv;private SearchView sc;private SimpleCursorAdapter adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv = (ListView) findViewById(R.id.lv);sc = (SearchView) findViewById(R.id.sc);adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.lvitem,null, new String[] { "uname", "upwd" }, new int[] { R.id.name,R.id.pwd },SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);lv.setAdapter(adapter);// 初始化启动LoadergetLoaderManager().initLoader(1, null, this);sc.setOnQueryTextListener(new OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String query) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onQueryTextChange(String newText) {// TODO Auto-generated method stubBundle args = new Bundle();args.putString("key", newText);getLoaderManager().restartLoader(1, args, MainActivity.this);return false;}});}@Overridepublic Loader<Cursor> onCreateLoader(int id, Bundle args) {// TODO Auto-generated method stubMyLoad myLoad = new MyLoad(MainActivity.this, args);return myLoad;}@Overridepublic void onLoadFinished(Loader<Cursor> loader, Cursor data) {// TODO Auto-generated method stubadapter.changeCursor(data);}@Overridepublic void onLoaderReset(Loader<Cursor> loader) {// TODO Auto-generated method stubadapter.changeCursor(null);}}

public class MyLoad extends AsyncTaskLoader<Cursor> {private Bundle bundle;    private Uri uri =  Uri.parse("content://应用程序的包名.数据库名/表名(一般自定义)");private String selection;private String[] selectionArgs;private String[] columns = {"_id","uname","upwd"};public MyLoad(Context context,Bundle bundle) {super(context);this.bundle = bundle;}public MyLoad(Context context) {super(context);// TODO Auto-generated constructor stub}@Overrideprotected void onStartLoading() {// TODO Auto-generated method stubsuper.onStartLoading();forceLoad();}@Overridepublic Cursor loadInBackground() {// TODO Auto-generated method stub         if(bundle != null){         selection = "uname like ?";         selectionArgs = new String[] {"%"+bundle.getString("key")+"%"};         }Cursor cursor = getContext().getContentResolver().query(uri,columns, selection, selectionArgs, null);return cursor;}}



0 0