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;}}
有兴趣的人可以对比一下。
源代码下载
- LoaderManager的原理和示例
- android之LoaderManager原理分析
- Android中LoaderManager:AsyncTaskLoader和CursorLoader的使用
- 自动读取短信验证码LoaderManager和CursorLoader的使用
- LoaderManager的使用
- LoaderManager.LoaderCallbacks的使用
- LoaderManager 的 使用
- LoaderManager的使用
- LoaderManager的理解
- LoaderManager的使用
- java Semaphore信号量的原理和示例
- redis长连接的原理和示例
- LoaderManager
- LoaderManager
- LoaderManager和Loader初步使用
- LoaderManager和AsyncTaskLoader<D>详解
- Android之LoaderManager的使用
- 木马彩衣的原理和代码示例
- 第一次坐飞机
- NFC学习——NFC Enable 过程分析(一)
- 『网络』记录
- TFS - Analysis 数据库问题
- myEclipse8.5优化
- LoaderManager的原理和示例
- 空域图像增强学习笔记
- nslookup 域名
- Yii中截取字符串(UTF-8)的方法
- OCP-1Z0-053-V12.02-185题
- 自己写的一个delphi正整数快速排序
- 内核编译出错总结
- c fork
- 实战Linux Bluetooth编程(六) L2CAP编程实例