Android Loader 技术的简单实用
来源:互联网 发布:什么软件打电话免费 编辑:程序博客网 时间:2024/05/16 10:52
从Android3.0开始,Android SDK提供了Loader技术,使用Loader技术可以很容易进行数据的异步加载。Loader技术为我们提供的核心类有:
- LoaderManager:可以通过Activity或者的Fragment的getLoaderManager()方法得到LoaderManager,用来对Loader进行管理,一个Activity或者Fragment只能有一个LoaderManager。
- LoaderManager.LoaderCallbacks:用于同LoaderManager进行交互,可以在其中创建Loader对象。
- AsyncTaskLoader:抽象类,可以进行异步加载数据的Loader,貌似内部也是通过AsynTask实现的,可以通过继承它构建自己的Loader,也可以使用现有的子类,例如异步查询数据库可以使用CursorLoader。
使用Loader一般可以经过以下步骤:
1、初始化Loader,可以使用initLoader(intid, Bundle args, LoaderManager.LoaderCallbacks<D> callback);方法进行初始化。id:标识Loader的ID,一个Activity或者Fragment只能有一个LoaderManager,但可以有多个Loader,通过ID区 分。在新建Loader时,如果发现已经有相同ID的Loader就会复用该Loader,而不会重新创建。2、实现LoaderManager.LoaderCallbacks中的方法,LoaderManager.LoaderCallbacks中需要实现的方法有:
args:传给新建Loader的参数。Callback:回调接口。
- publicLoader<D> onCreateLoader(int id, Bundle args):创建新的Loader,id为LoaderID,如果已经有相同ID的Loader就会复用该Loader,而不会重新创建。 args为初始化时传递的参数。该方法开始异步查询,并返回一个泛型类,如果是查询数据库可以返回一个CursorLoader,可以返回自定义的Loader。
- public voidonLoadFinished(Loader<D> loader, D data):异步查询结束的会调用这个方法,并返回查询结果 data。
- public void onLoaderReset(Loader<D> loader): 当调用Loader.reset()将Loader数据清空时,但在系统销毁Loader时会自动调用Loader.reset()方法,我们一般不需要手动调用,只需要在onLoaderReset方法中,将使用Loader的移除。
3、使用 restartLoader(intid, Bundle args, LoaderManager.LoaderCallbacks<D> callback)方法进行数据更新,和初始化一个,如果有相同id的Loader存在,会复用Loader,并清空原有Loader中的数据,如果没有就新建一个。这个方法一般使用在需要更新数据时,例如下面例子中,在搜索关键改变时,需要调用这个方法,从新异步查询数据。
下面一个例子使用CursorLoader查询联系人名字,并显示在ListActivity中,在ActionBar上放置了一个SearchView可以根据联系人姓名关键字查询联系人。
Activity代码如下:
public class MainActivity extends ListActivity implements LoaderManager.LoaderCallbacks<Cursor>, SearchView.OnQueryTextListener {private SimpleCursorAdapter cursorAdapter; private String filterName=null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv= (TextView) findViewById(android.R.id.empty); tv.setText("请稍后"); cursorAdapter=new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, null, new String[]{ContactsContract.Contacts.DISPLAY_NAME}, new int[]{android.R.id.text1},0); setListAdapter(cursorAdapter); //初始化Loader getLoaderManager().initLoader(0,null,this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { Uri uri; String[] pro=new String[]{ ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts._ID}; if(TextUtils.isEmpty(filterName)){ uri= ContactsContract.Contacts.CONTENT_URI; }else{ uri=Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI,Uri.encode(filterName)); } //创建Loader对象,开始异步加载数据 return new CursorLoader(this,uri,pro, null, null,null); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { //得到异步加载数据,更新Adapter cursorAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { //移除adapter使用的Loader,系统会释放不再使用的Loader cursorAdapter.swapCursor(null); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main,menu); SearchView v= (SearchView) menu.findItem(R.id.menu_search).getActionView(); v.setOnQueryTextListener(this); return true; } @Override public boolean onQueryTextSubmit(String query) { return true; } @Override public boolean onQueryTextChange(String newText) { filterName=newText; //使用新的Loader(清空旧的数据) getLoaderManager().restartLoader(0,null,this); return false; }}
菜单资源文件:
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".MainActivity"> <item android:actionViewClass="android.widget.SearchView" android:id="@+id/menu_search" android:showAsAction="ifRoom|collapseActionView" android:title="搜索" tools:ignore="AppCompatResource" /></menu>
最后来个效果图:
0 0
- Android Loader 技术的简单实用
- (4.1.38)Android Loader 技术的简单实用
- Android loader的简单使用
- 简单实用的进度条加载组件loader.js
- Android里的Boot Loader简单介绍
- Android里的Boot Loader简单介绍
- android Universal-Image-Loader的简单使用
- Android-Universal-Image-Loader的简单使用
- android的canvas简单实用
- Android AlertDialog的简单实用
- android PopupWindow的简单实用
- Android WebView的简单实用
- Android Paint的简单实用
- Android ConvenientBanner的简单实用
- Android SqlLite的简单实用
- Android Loader简单使用
- ANDROID LOADER简单了解
- Loader的简单实现
- centos上编译安装gnuplot问题总结
- SDUT_2015寒假集训_结构体练习_H-顺序建立链表
- zoj_2278-Fight for Food
- UITableView的优化
- Linux的UDP基础编程
- Android Loader 技术的简单实用
- 黑马程序员——————Java 反射
- Webfont
- linux下adb工具的安装
- 顺序表相关操作
- weblogic启动受管服务器报错Authentication for user weblogic denied
- linux shell
- OJ_几点几分几秒_1244
- opencv ubuntu 编译篇