Android异步加载数据--Loader
2016-09-13 20:22
369 查看
一, 什么是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, 构造方法
查询联系人实例:
自定义实例:
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; @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<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; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // TODO Loader数据加载结束 adapter.changeCursor(data); } @Override public 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; @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<Cursor> onCreateLoader(int id, Bundle args) { // TODO Auto-generated method stub MyLoad myLoad = new MyLoad(MainActivity.this, args); return myLoad; } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // TODO Auto-generated method stub adapter.changeCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { // TODO Auto-generated method stub adapter.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 } @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 Loader 异步加载数据
- Android_Loader_使用LoaderManager管理Loader实现异步动态加载数据
- Android异步加载数据---Loader
- Android进阶——自定义Loader以一种更优美的方式异步加载不同类型的数据(二)
- Android_Loader_使用LoaderManager管理Loader实现异步动态加载数据
- [置顶] Android_Loader_使用LoaderManager管理Loader实现异步动态加载数据
- Android进阶——借助Loader机制以一种更优美的方式异步加载数据(一)
- Android 使用Android-Universal-Image-Loader进行异步数据加载
- Android_Loader_使用LoaderManager管理Loader实现异步动态加载数据
- Android 异步加载数据 AsyncTask+Handler+AsyncHttpClient+Universal_Image_loader+Volley
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比
- android学习 豆瓣 自定义Progressbar 异步任务加载数据等
- 【移动开发】Android中异步加载数据(一)Handler + Thread
- (Android实战)ProgressBar+AsyncTask实现界面数据异步加载(含效果图)
- Android中ListView异步加载数据
- Android利用universal-image-loader异步加载大量图片完整示例
- Android利用universal-image-loader异步加载大量图片完整示例
- Android中ListView异步加载数据
- android学习 豆瓣 自定义Progressbar 异步任务加载数据等
- Android ListView 正在加载 异步载入数据 CursorLoader 例子