AsyncTaskLoader的使用步骤:
1.让主Activity实现LoaderCallbacks<Cursor>接口
2.构建一个LoaderManager()
manager=getLoaderManager()
3.实现一个Loader,并初始化
manager.initLoader(id,Bundle,LoaderCallbacks);
4.构建SimpleCursorAdapter,传递一个空的数据源
5.绑定数据源
6.一个类继承AsyncTaskLoader<Cursor>
在menu配置文件中配置SearchView
android:showAsAction="always"
android:actionViewClass="android.widget.SearchView"
示例代码:
public class MainActivity extends Activity implements LoaderCallbacks<Cursor> { private ListView listView_main_info; private TextView textView_empty; private SimpleCursorAdapter adapter; private LoaderManager manager; private final static String TAG = "MainActivity";
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
listView_main_info = (ListView) findViewById(R.id.listView_main_info); textView_empty = (TextView) findViewById(R.id.textView_empty);
// 1. 构建一个LoaderManager manager = getLoaderManager();
// 2. 实现一个Loader,并初始化Loader /** * @param1:Loader的唯一标识id * @param2:Bundle 用来传递给Loader的数据 * @param3:LoaderCallbacks的回调接口 */ manager.initLoader(1, null, this);
// 3. 实现LoaderManager.LoaderCallbacks
// 4. 构建SimpleCursorAdapter,先传递一个空值 //参数说明: 1:布局,2:数据源,3:列名,4:控件ID adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, null, new String[] { "address", "body" }, new int[] { android.R.id.text1, android.R.id.text2 }, 1);
// 5. 绑定 listView_main_info.setAdapter(adapter); listView_main_info.setEmptyView(textView_empty); }
// Menu ActionBar @Override /** * 如果id不存在,则会触发onCreateLoader方法,在这个方法中需要去创建一个Loader,并返回 */ public Loader<Cursor> onCreateLoader(int id, Bundle bundle) { Log.i(TAG, "--------onCreateLoader-------->>" + Thread.currentThread().getId() + ":" + Thread.currentThread().getName()); // 创建一个Loader,并返回 return new MyLoader(this, bundle); }
@Override /** * 当先前被创建的Loader完成数据加载的时候,会触发这个方法的调用 */ public void onLoadFinished(Loader<Cursor> loader, Cursor data) { Log.i(TAG, "--------onLoadFinished-------->>" + Thread.currentThread().getId() + ":" + Thread.currentThread().getName()); // 交换Cursor,内部而且会去帮我们关闭老的Cursor, adapter.swapCursor(data); }
@Override /** *当先前被创建的Loader被复位的时候,会触发这个方法的调用 */ public void onLoaderReset(Loader<Cursor> loader) { adapter.swapCursor(null); }
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search) .getActionView();
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override public boolean onQueryTextSubmit(String query) { // TODO Auto-generated method stub return false; }
@Override public boolean onQueryTextChange(String newText) {
Bundle bundle = new Bundle(); bundle.putString("KEY", newText); // 再次调用OnCreate方法 manager.restartLoader(1, bundle, MainActivity.this); return false; } }); return true; }
@Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); manager.destroyLoader(1); } }
public class MyLoader extends AsyncTaskLoader<Cursor> { private final static String TAG = "MyLoader"; private Context context; private Bundle bundle;
// private ContentResolver resolver; public MyLoader(Context context, Bundle bundle) { super(context); this.context = context; this.bundle = bundle; // resolver=context.getContentResolver(); }
@Override /** * 在执行loadInBackground的耗时工作之前,会调用的一个方法 * 强制执行loadInBackground方法 */ protected void onStartLoading() { Log.i(TAG, "------onStartLoading----->>" + Thread.currentThread().getId() + ":" + Thread.currentThread().getName()); super.onStartLoading(); forceLoad(); }
@Override /** *完成耗时的工作 */ public Cursor loadInBackground() { Log.i(TAG, "------loadInBackground----->>" + Thread.currentThread().getId() + ":" + Thread.currentThread().getName()); Cursor cursor = null;
// 耗时的工作:去ContentProvider或者本地的数据库中去装载大批量的数据 if (bundle == null) { // 初始化 // 去获取sms的数据 cursor = getContext().getContentResolver() .query(Uri.parse("content://sms"), new String[] { "_id", "address", "body" }, null, null, null); } else { // restart String keyword = bundle.getString("KEY"); cursor = getContext().getContentResolver().query( Uri.parse("content://sms"), new String[] { "_id", "address", "body" }, "body like ?", new String[] { keyword + "%" }, null); }
return cursor; }
@Override /** * 并不是代表数据加载完成,只是停止装载(有可能数据没有装载完成),当应用程序退出的时候会触发这个方法 */ protected void onStopLoading() { Log.i(TAG, "------onStopLoading----->>" + Thread.currentThread().getId() + ":" + Thread.currentThread().getName()); super.onStopLoading(); stopLoading(); // 停止数据装载 }
} |
CursorLoader的使用步骤:
1. 构建一个LoaderManager manager = getLoaderManager();
2. 用loaderManager实现并初始化loader manager.initLoader(1, null, this);
3. 让Activity实现LoaderCallbacks<Cursor>接口,并实现为实现的方法
4. 构建SimpleCursorAdapter,并且数据源设为一个空值
5. 绑定适配器
案例:
public classMainActivity extends Activity implements LoaderCallbacks<Cursor> {
private ListView listView_main_info;
private TextView textView_main_info;
private LoaderManager manager;
private SimpleCursorAdapter adapter;
private Cursor cursor = null;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView_main_info =(ListView) findViewById(R.id.listView_main_info);
textView_main_info =(TextView) findViewById(R.id.textView_main_info);
manager = getLoaderManager();
manager.initLoader(1, null,this);
adapter = newSimpleCursorAdapter(this,
android.R.layout.simple_list_item_2,null, new String[] {
"_id","display_name" }, new int[] {
android.R.id.text1,android.R.id.text2 }, 1);
listView_main_info.setAdapter(adapter);
listView_main_info.setEmptyView(textView_main_info);
// 注册上下文菜单
registerForContextMenu(listView_main_info);
}
@Override
public Loader<Cursor>onCreateLoader(int id, Bundle bundle) {
if (bundle == null) {
return newCursorLoader(MainActivity.this,
ContactsContract.RawContacts.CONTENT_URI,new String[] {
"_id","display_name" }, "deleted=0", null, null);
} else {
String keyword =bundle.getString("KEY");
return newCursorLoader(MainActivity.this,
ContactsContract.RawContacts.CONTENT_URI,new String[] {
"_id","display_name" },
"deleted=0and display_name like ?", new String[] { keyword
+"%" }, null);
}
}
@Override
public voidonLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
cursor = data;
}
@Override
public voidonLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
@Override
public voidonCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfomenuInfo) {
super.onCreateContextMenu(menu,v, menuInfo);
AdapterContextMenuInfo info =(AdapterContextMenuInfo) menuInfo;
cursor.moveToPosition(info.position);
menu.add(0, 1, 0, "删除联系人");
menu.setHeaderTitle(cursor.getString(cursor
.getColumnIndex("display_name")));
}
@Override
public booleanonContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info =(AdapterContextMenuInfo) item
.getMenuInfo();
String display_name =cursor.getString(cursor
.getColumnIndex("display_name"));
switch (item.getItemId()) {
case 1:
// 删除信息
ContentValues values= new ContentValues();
values.put("deleted",1);
int count =getContentResolver().update(
ContactsContract.RawContacts.CONTENT_URI,values,
"display_name=?",new String[] { display_name });
if (count > 0) {
// 重启Loader
manager.restartLoader(1,null, MainActivity.this);
}
break;
default:
break;
}
returnsuper.onContextItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menumenu) {
getMenuInflater().inflate(R.menu.main,menu);
SearchView searchView =(SearchView) menu.findItem(R.id.action_search)
.getActionView();
searchView.setOnQueryTextListener(newOnQueryTextListener() {
@Override
public booleanonQueryTextSubmit(String query) {
// TODOAuto-generated method stub
returnfalse;
}
@Override
public booleanonQueryTextChange(String newText) {
Bundlebundle = new Bundle();
bundle.putString("KEY",newText);
manager.restartLoader(1,bundle, MainActivity.this);
returnfalse;
}
});
return true;
}
@Override
public booleanonOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_contacts: //查看联系人的信息
Intent intent =newIntent();
intent.setAction("com.android.contacts.action.LIST_CONTACTS");
startActivity(intent);
break;
case R.id.action_restore: // 恢复删除的联系人
ContentValues values= new ContentValues();
values.put("deleted",0);
int count =getContentResolver().update(
ContactsContract.RawContacts.CONTENT_URI,values, null,
null);
if (count > 0) {
// 重启Loader
manager.restartLoader(1,null, MainActivity.this);
}
break;
default:
break;
}
returnsuper.onOptionsItemSelected(item);
}
}