LoaderManager的原理和示例

来源:互联网 发布:维修行业数据 编辑:程序博客网 时间:2024/05/06 04:51

   LoaderManager是对异步查询的一种封装,常用于对cursor的操作,我们知道,cursor查询时比较耗时的,如果cursor在主线程上去做查询,就阻塞主线程,我们考虑异步操作,android提供LoaderManager,它有个接口LoaderCallbacks,里面有三个回调方法,其中onCreateLoader是在子线程中运行,主要做查询使用,onLoadFinished处理onCreateLoader得到的结果,onLoaderReset是重置loader,将cursor设置为空,我们通过一个方法启动它,getLoaderManager().initLoader();以下是一个demo:

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);FragmentManager fragmentManager = getFragmentManager();if (fragmentManager.findFragmentById(android.R.id.content) == null) {CursorLoaderListFragment list = CursorLoaderListFragment.getInstance();fragmentManager.beginTransaction().add(android.R.id.content, list).commit();}}public static class CursorLoaderListFragment extends ListFragment implementsLoaderCallbacks<Cursor> {SimpleCursorAdapter mAdapter;static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {Contacts._ID, Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS,Contacts.CONTACT_PRESENCE, Contacts.PHOTO_ID,Contacts.LOOKUP_KEY, };@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);// Give some text to display if there is no data. In a real// application this would come from a resource.setEmptyText("No phone numbers");// We have a menu item to show in action bar.setHasOptionsMenu(true);// Create an empty adapter we will use to display the loaded data.mAdapter = new SimpleCursorAdapter(getActivity(),android.R.layout.simple_list_item_2, null, new String[] {Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },new int[] { android.R.id.text1, android.R.id.text2 }, 0);setListAdapter(mAdapter);// Start out with a progress indicator.setListShown(false);// Prepare the loader. Either re-connect with an existing one,// or start a new one.getLoaderManager().initLoader(0, null, this);}private static CursorLoaderListFragment getInstance() {CursorLoaderListFragment fragment = new CursorLoaderListFragment();return fragment;}@Overridepublic Loader<Cursor> onCreateLoader(int id, Bundle args) {// TODO Auto-generated method stubUri baseUri = Contacts.CONTENT_URI;String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("+ Contacts.HAS_PHONE_NUMBER + "=1) AND ("+ Contacts.DISPLAY_NAME + " != '' ))";return new CursorLoader(getActivity(), baseUri,CONTACTS_SUMMARY_PROJECTION, select, null,Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");}@Overridepublic void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {// TODO Auto-generated method stubmAdapter.swapCursor(arg1);// The list should now be shown.if (isResumed()) {setListShown(true);} else {setListShownNoAnimation(true);}}@Overridepublic void onLoaderReset(Loader<Cursor> arg0) {// TODO Auto-generated method stubmAdapter.swapCursor(null);}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}


我也做了一个查询,是在主线程运行,如果数据量很大,就会看到差别非常明显,在主线程运行的程序,反应比较慢。

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);FragmentManager fragmentManager = getFragmentManager(); if (fragmentManager.findFragmentById(android.R.id.content) == null) {            CursorLoaderListFragment list = CursorLoaderListFragment.getInstance();            fragmentManager.beginTransaction().add(android.R.id.content, list).commit();        }}public static class CursorLoaderListFragment extends ListFragment{SimpleCursorAdapter mAdapter;static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {            Contacts._ID,            Contacts.DISPLAY_NAME,            Contacts.CONTACT_STATUS,            Contacts.CONTACT_PRESENCE,            Contacts.PHOTO_ID,            Contacts.LOOKUP_KEY,        }; @Override public void onActivityCreated(Bundle savedInstanceState) {            super.onActivityCreated(savedInstanceState);            // Give some text to display if there is no data.  In a real            // application this would come from a resource.            setEmptyText("No phone numbers");            // We have a menu item to show in action bar.            setHasOptionsMenu(true);            String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("                    + Contacts.HAS_PHONE_NUMBER + "=1) AND ("                    + Contacts.DISPLAY_NAME + " != '' ))";            Cursor cursor = getActivity().getContentResolver()            .query(Contacts.CONTENT_URI, CONTACTS_SUMMARY_PROJECTION, select,             null, Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");                        // Create an empty adapter we will use to display the loaded data.            mAdapter = new SimpleCursorAdapter(getActivity(),                    android.R.layout.simple_list_item_2, cursor,                    new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },                    new int[] { android.R.id.text1, android.R.id.text2 }, 0);            setListAdapter(mAdapter);            // Start out with a progress indicator.            setListShown(true);            // Prepare the loader.  Either re-connect with an existing one,            // or start a new one.        }  private static CursorLoaderListFragment getInstance() {CursorLoaderListFragment fragment = new CursorLoaderListFragment();return fragment;}}

有兴趣的人可以对比一下。

源代码下载

原创粉丝点击