Android Loader详解四:回调及完整例子

简介:

From:http://blog.csdn.net/nkmnkm/article/details/7256605

 

onLoadFinished

这个方法是在前面已创建的装载器已经完成其加载过程后被调用.这个方法保证会在应用到装载器上的数据被释放之前被调用.在此方法中,你必须删除所有对旧数据的使用(因为它将很快会被删除),但是不要自己去释放它们,因为它们的装载器会做这些事情.

装载器一旦了解到应用不再使用数据时,将马上释放这些数据.例如,如果数据是一个从CursorLoader来的游标,你不应调用游标的close().如果游标被放置在一个CursorAdapter中,你应使用swapCursor()方法,以使旧的游标不被关闭.例如:

 

[java]  view plain copy
  1. //这个Adapter被用于显示列表的数据.  
  2. SimpleCursorAdapter mAdapter;  
  3. ...  
  4.   
  5. public void onLoadFinished(Loader<Cursor> loader, Cursor data) {  
  6.     // Swap the new cursor in.  (The framework will take care of closing the  
  7.     // old cursor once we return.)  
  8.     mAdapter.swapCursor(data);  
  9. }  

 

 

onLoaderReset

当一个已创建的装载器被重置从而使其数据无效时,此方法被调用.此回调使你能发现什么时候数据将被釋放于是你可以釋放对它的引用.

下面这个实现调用参数为nullswapCursor()

 

[java]  view plain copy
  1. // 这个Adapter被用于显示列表的数据.  
  2. SimpleCursorAdapter mAdapter;  
  3. ...  
  4.   
  5. public void onLoaderReset(Loader<Cursor> loader) {  
  6.     //此处是用于上面的onLoadFinished()的游标将被关闭时执行, 我们需确保我们不再使用它.  
  7.     mAdapter.swapCursor(null);  
  8. }  

 

 

例子

作为一个例子,这里完整实现了一个Fragment显示一个包含从联系人contentprovider 返回查询数据的ListView的内容的功能.它使用一个CursorLoader来管理对provider的查询.


为了能从用户的联系人中取得数据,本例的manifest必须包含READ_CONTACTS权限.

 

[java]  view plain copy
  1. public static class CursorLoaderListFragment extends ListFragment  
  2.         implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> {  
  3.   
  4.     // 这是用于显示列表数据的Adapter  
  5.     SimpleCursorAdapter mAdapter;  
  6.   
  7.     // 如果非null,这是当前的搜索过虑器  
  8.     String mCurFilter;  
  9.   
  10.     @Override public void onActivityCreated(Bundle savedInstanceState) {  
  11.         super.onActivityCreated(savedInstanceState);  
  12.   
  13.         // 如果列表中没有数据,就给控件一些文字去显示.在一个真正的应用  
  14.         // 中这应用资源中取得.  
  15.         setEmptyText("No phone numbers");  
  16.   
  17.         // 我们在动作栏中有一个菜单项.  
  18.         setHasOptionsMenu(true);  
  19.   
  20.         // 创建一个空的adapter,我们将用它显示加载后的数据  
  21.         mAdapter = new SimpleCursorAdapter(getActivity(),  
  22.                 android.R.layout.simple_list_item_2, null,  
  23.                 new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },  
  24.                 new int[] { android.R.id.text1, android.R.id.text2 }, 0);  
  25.         setListAdapter(mAdapter);  
  26.   
  27.         // 准备loader.可能是重连到一个已存在的或开始一个新的  
  28.         getLoaderManager().initLoader(0nullthis);  
  29.     }  
  30.   
  31.     @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {  
  32.         // 放置一个动作栏项用于搜索.  
  33.         MenuItem item = menu.add("Search");  
  34.         item.setIcon(android.R.drawable.ic_menu_search);  
  35.         item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);  
  36.         SearchView sv = new SearchView(getActivity());  
  37.         sv.setOnQueryTextListener(this);  
  38.         item.setActionView(sv);  
  39.     }  
  40.   
  41.     public boolean onQueryTextChange(String newText) {  
  42.         // 在动作栏上的搜索字串改变时被调用.更新  
  43.         //搜索过滤器,并重启loader来执行一个新的查询  
  44.         mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;  
  45.         getLoaderManager().restartLoader(0nullthis);  
  46.         return true;  
  47.     }  
  48.   
  49.     @Override public boolean onQueryTextSubmit(String query) {  
  50.         // 我们不关心这个方法  
  51.         return true;  
  52.     }  
  53.   
  54.     @Override public void onListItemClick(ListView l, View v, int position, long id) {  
  55.         // 写入你想写的代码  
  56.         Log.i("FragmentComplexList""Item clicked: " + id);  
  57.     }  
  58.   
  59.     // 这是我们想获取的联系人中一行的数据.  
  60.     static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {  
  61.         Contacts._ID,  
  62.         Contacts.DISPLAY_NAME,  
  63.         Contacts.CONTACT_STATUS,  
  64.         Contacts.CONTACT_PRESENCE,  
  65.         Contacts.PHOTO_ID,  
  66.         Contacts.LOOKUP_KEY,  
  67.     };  
  68.     public Loader<Cursor> onCreateLoader(int id, Bundle args) {  
  69.         // 当一个新的loader需被创建时调用.本例仅有一个Loader,  
  70.         //所以我们不需关心ID.首先设置base URI,URI指向的是联系人  
  71.         Uri baseUri;  
  72.         if (mCurFilter != null) {  
  73.             baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,  
  74.                     Uri.encode(mCurFilter));  
  75.         } else {  
  76.             baseUri = Contacts.CONTENT_URI;  
  77.         }  
  78.   
  79.         // 现在创建并返回一个CursorLoader,它将负责创建一个  
  80.         // Cursor用于显示数据  
  81.         String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("  
  82.                 + Contacts.HAS_PHONE_NUMBER + "=1) AND ("  
  83.                 + Contacts.DISPLAY_NAME + " != '' ))";  
  84.         return new CursorLoader(getActivity(), baseUri,  
  85.                 CONTACTS_SUMMARY_PROJECTION, select, null,  
  86.                 Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");  
  87.     }  
  88.   
  89.     public void onLoadFinished(Loader<Cursor> loader, Cursor data) {  
  90.         // 将新的cursor换进来.(框架将在我们返回时关心一下旧cursor的关闭)  
  91.         mAdapter.swapCursor(data);  
  92.     }  
  93.   
  94.     public void onLoaderReset(Loader<Cursor> loader) {  
  95.         //在最后一个Cursor准备进入上面的onLoadFinished()之前.  
  96.         // Cursor要被关闭了,我们需要确保不再使用它.  
  97.         mAdapter.swapCursor(null);  
  98.     }  
  99. }  

 本文转自老Zhan博客园博客,原文链接:http://www.cnblogs.com/mybkn/articles/2485230.html,如需转载请自行联系原作者

相关文章
|
6月前
|
Java Android开发
Android系统 获取用户最后操作时间回调实现和原理分析
Android系统 获取用户最后操作时间回调实现和原理分析
195 0
|
开发工具 Android开发 开发者
Android如何回调编码后的音视频数据
有开发者提到,在RTMP推送端的基础上,希望能回调编码后的音视频数据,便于开发者对接第三方系统,如GB28181.
|
28天前
|
Java 程序员 开发工具
Android|修复阿里云播放器下载不回调的问题
虽然 GC 带来了很多便利,但在实际编码时,我们也需要注意对象的生命周期管理,该存活的存活,该释放的释放,避免因为 GC 导致的问题。
33 2
|
3月前
|
算法 数据处理 开发工具
Android平台RTSP|RTMP播放器如何回调YUV或RGB数据
在开发Android平台上的RTSP或RTMP播放器时,开发者不仅追求低延迟播放,还希望获取解码后的视频数据(如YUV或RGB格式),以便进行视觉算法分析。使用大牛直播SDK中的SmartPlayer,可在确保播放流畅的同时,通过设置外部渲染器(`SmartPlayerSetExternalRender`)来高效地回调原始视频数据。例如,对于RGBA数据,需实现`NTExternalRender`接口,并重写相关方法以处理数据和尺寸变化。同样地,对于I420(YUV)数据,也需要相应地实现接口以满足需求。这种方式使得开发者能在不影响常规播放功能的情况下,进行定制化的视频处理任务。
|
3月前
|
开发工具 Android开发
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
Android项目架构设计问题之SDK内部减少每次回调时的冗余判断逻辑如何解决
40 0
|
3月前
|
开发工具 Android开发
Android项目架构设计问题之外部客户方便地设置回调如何解决
Android项目架构设计问题之外部客户方便地设置回调如何解决
28 0
|
3月前
|
Java API 开发工具
Android项目架构设计问题之为SDK添加新的回调支持如何解决
Android项目架构设计问题之为SDK添加新的回调支持如何解决
25 0
|
6月前
|
Android开发
Android Loader机制
Android Loader机制
55 1
|
6月前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
365 0
|
Java Android开发 C++
[笔记]Visual Studio 2015 开发安卓so库JNI层——回调调用
[笔记]Visual Studio 2015 开发安卓so库JNI层——回调调用