Android异步加载数据--Loader
来源:互联网 发布:旅游分销系统源码 编辑:程序博客网 时间:2024/05/17 03:30
一, 什么是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() , 在此方法中执行获取数据的操作, 并将结果返回
自定义实例:
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
- Android异步加载数据---Loader
- Android Loader 异步加载数据
- Android异步加载数据--Loader
- Android Loader机制,实现异步加载数据
- android---(Loader异步加载)
- 使用Loader加载异步数据
- Loader(异步加载数据)
- Android 使用Android-Universal-Image-Loader进行异步数据加载
- 【Android】使用LoaderManager管理Loader实现异步动态加载数据
- AndroidのLoaderManager管理Loader实现异步动态加载数据
- Android—Loader异步加载
- Android-Universal-Image-Loader 异步加载图片
- Android异步加载器Loader的使用
- Android 异步加载神器Loader全解析
- Android Loader 异步加载详解二:探寻Loader内部机制
- 【Android学习笔记】Activity的小弟--Fragment以及异步加载数据的Loader
- Loader异步加载
- Loader异步加载ContentProvider
- MD5加密
- java_日期和时间字符串格式化
- CentOS连网
- 自定义Action Bar
- 好博客
- Android异步加载数据--Loader
- Bean的作用域及生命周期
- 递归的介绍
- Chart图表
- filter与servlet的比较
- Android 更新UI 只能在主线程?
- 2-2 Time类的定义
- C#中的接口和类有什么异同。
- 反射