Loader的使用
private void initMyLoader() { getLoaderManager().initLoader(0, null, mLoader); } 初始化Loader,可以使用initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);方法进行初始化。 id:标识Loader的ID,一个Activity或者Fragment只能有一个LoaderManager,但可以有多个Loader,通过ID区分。在新建Loader时,如果发现已经有相同ID的Loader就会复用该Loader,而不会重新创建。 Callback:回调接口。 |
/** * 实现一个加载器 * * @author Administrator * */ private class MyLoaderListener implements LoaderManager.LoaderCallbacks<Cursor> {
@Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // TODO Auto-generated method stub 当一个新的loader需被创建时调用,进行数据库访问操作,结果返回 m_FinishLoaderFlag = false; CursorLoader cursor = new CursorLoader(MainActivity.this, CallLog.Calls.CONTENT_URI, CALLLOG_PROJECTION, null, null, CallLog.Calls.DEFAULT_SORT_ORDER); Log.d(TAG, "MyLoaderListener---------->onCreateLoader"); return cursor; }
@Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { // TODO Auto-generated method stub 当loader加载数据完成后执行的操作,主要是对数据的处理,展现 }
@Override public void onLoaderReset(Loader<Cursor> loader) { // TODO Auto-generated method stub 当一个已创建的加载器被重置从而使其数据无效时,此方法被调用。此回调使你能发现什么时候数据将被释放于是你可以释放对它的引用。 } } |
使用 restartLoader(int id, Bundle args, LoaderManager.LoaderCallbackscallback)方法进行数据更新,和初始化一个,如果有相同id的Loader存在,会复用Loader,并清空原有Loader中的数据,如果没有就新建一个。这个方法一般使用在需要更新数据时,例如下面例子中,在搜索关键改变时,需要调用这个方法,从新异步查询数据。 |
完整案例:
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; } |