标签:android loader cursorloader 异步加载
从Android3.0开始,Android SDK提供了Loader技术,使用Loader技术可以很容易进行数据的异步加载。Loader技术为我们提供的核心类有:
使用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:回调接口。
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>最后来个效果图:
标签:android loader cursorloader 异步加载
原文地址:http://blog.csdn.net/yifei1989/article/details/42779543