Android异步加载数据--Loader

一, 什么是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 loader, Cursor data)
            {
                //adapter.swapCursor(data);
                adapter.changeCursor(data);// 多了一个关闭Cursor的操作
            }
        3, 在创建新的Loader之前, 重置之前Loader加载的数据
            onLoaderReset(Loader loader)
            {
            
                //adapter.swapCursor(null);
                adapter.changeCursor(null);// 多了一个关闭Cursor的操作
            }
    CursorLoader
        CursorLoader 内部使用了CotentResolver 加载ContentProvider暴露出来的数据,通过URI
        内置CotentObserver,监听数据源的变化

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

        4, 构造方法

查询联系人实例:

public class MainActivity extends Activity implements LoaderCallbacks {
	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;

	@Override
	protected 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() {
			@Override
			public void onTextChanged(CharSequence s, int start, int before,
					int count) {
				// TODO Auto-generated method stub
			}
			@Override
			public void beforeTextChanged(CharSequence s, int start, int count,
					int after) {
				// TODO Auto-generated method stub
			}
			@Override
			public void afterTextChanged(Editable s) {
				// TODO
				Bundle 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);
	}
	@Override
	public Loader 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;
	}
	@Override
	public void onLoadFinished(Loader loader, Cursor data) {
		// TODO Loader数据加载结束
		adapter.changeCursor(data);
	}
	@Override
	public void onLoaderReset(Loader loader) {
		// TODO Auto-generated method stub
		// 清除旧数据
		adapter.changeCursor(null);
	}
}

自定义实例:

public class MainActivity extends Activity implements LoaderCallbacks {
	private ListView lv;
	private SearchView sc;
	private SimpleCursorAdapter adapter;

	@Override
	protected 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);
		// 初始化启动Loader
		getLoaderManager().initLoader(1, null, this);

		sc.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 args = new Bundle();
				args.putString("key", newText);
				getLoaderManager().restartLoader(1, args, MainActivity.this);
				return false;
			}
		});
	}

	@Override
	public Loader onCreateLoader(int id, Bundle args) {
		// TODO Auto-generated method stub
		MyLoad myLoad = new MyLoad(MainActivity.this, args);
		return myLoad;
	}

	@Override
	public void onLoadFinished(Loader loader, Cursor data) {
		// TODO Auto-generated method stub
		adapter.changeCursor(data);
	}

	@Override
	public void onLoaderReset(Loader loader) {
		// TODO Auto-generated method stub
		adapter.changeCursor(null);
	}

}

public class MyLoad extends AsyncTaskLoader {

	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
	}

	@Override
	protected void onStartLoading() {
		// TODO Auto-generated method stub
		super.onStartLoading();
		forceLoad();
	}

	@Override
	public 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;
	}

}



你可能感兴趣的:(Android基础)