Android onLoadFinished与onLoaderReset回调详解及实例

所属分类: 软件编程 / Android 阅读数: 46
收藏 0 赞 0 分享

Android onLoadFinished与onLoaderReset回调详解及实例

onLoadFinished

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

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

//这个Adapter被用于显示列表的数据. 
SimpleCursorAdapter mAdapter; 
... 
 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
  // Swap the new cursor in. (The framework will take care of closing the 
  // old cursor once we return.) 
  mAdapter.swapCursor(data); 
} 

onLoaderReset

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

下面这个实现调用参数为null的swapCursor():

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

例子

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

public static class CursorLoaderListFragment extends ListFragment 
    implements OnQueryTextListener, LoaderManager.LoaderCallbacks<Cursor> { 
 
  // 这是用于显示列表数据的Adapter 
  SimpleCursorAdapter mAdapter; 
 
  // 如果非null,这是当前的搜索过虑器 
  String mCurFilter; 
 
  @Override public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
 
    // 如果列表中没有数据,就给控件一些文字去显示.在一个真正的应用 
    // 中这应用资源中取得. 
    setEmptyText("No phone numbers"); 
 
    // 我们在动作栏中有一个菜单项. 
    setHasOptionsMenu(true); 
 
    // 创建一个空的adapter,我们将用它显示加载后的数据 
    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); 
 
    // 准备loader.可能是重连到一个已存在的或开始一个新的 
    getLoaderManager().initLoader(0, null, this); 
  } 
 
  @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    // 放置一个动作栏项用于搜索. 
    MenuItem item = menu.add("Search"); 
    item.setIcon(android.R.drawable.ic_menu_search); 
    item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
    SearchView sv = new SearchView(getActivity()); 
    sv.setOnQueryTextListener(this); 
    item.setActionView(sv); 
  } 
 
  public boolean onQueryTextChange(String newText) { 
    // 在动作栏上的搜索字串改变时被调用.更新 
    //搜索过滤器,并重启loader来执行一个新的查询 
    mCurFilter = !TextUtils.isEmpty(newText) ? newText : null; 
    getLoaderManager().restartLoader(0, null, this); 
    return true; 
  } 
 
  @Override public boolean onQueryTextSubmit(String query) { 
    // 我们不关心这个方法 
    return true; 
  } 
 
  @Override public void onListItemClick(ListView l, View v, int position, long id) { 
    // 写入你想写的代码 
    Log.i("FragmentComplexList", "Item clicked: " + id); 
  } 
 
  // 这是我们想获取的联系人中一行的数据. 
  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, 
  }; 
  public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    // 当一个新的loader需被创建时调用.本例仅有一个Loader, 
    //所以我们不需关心ID.首先设置base URI,URI指向的是联系人 
    Uri baseUri; 
    if (mCurFilter != null) { 
      baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 
          Uri.encode(mCurFilter)); 
    } else { 
      baseUri = Contacts.CONTENT_URI; 
    } 
 
    // 现在创建并返回一个CursorLoader,它将负责创建一个 
    // Cursor用于显示数据 
    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"); 
  } 
 
  public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    // 将新的cursor换进来.(框架将在我们返回时关心一下旧cursor的关闭) 
    mAdapter.swapCursor(data); 
  } 
 
  public void onLoaderReset(Loader<Cursor> loader) { 
    //在最后一个Cursor准备进入上面的onLoadFinished()之前. 
    // Cursor要被关闭了,我们需要确保不再使用它. 
    mAdapter.swapCursor(null); 
  } 
} 

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多精彩内容其他人还在看

Android样式和主题之选择器的实例讲解

今天小编就为大家分享一篇关于Android样式和主题之选择器的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Android应用动态修改主题的方法示例

今天小编就为大家分享一篇关于Android应用动态修改主题的方法示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter 网络请求框架封装详解

这篇文章主要介绍了Flutter 网络请求框架封装详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Flutter倒计时/计时器的实现代码

这篇文章主要介绍了Flutter倒计时/计时器的实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

Android使用google breakpad捕获分析native cash

这篇文章主要介绍了Android使用google breakpad捕获分析native cash 的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
收藏 0 赞 0 分享

详解Flutter WebView与JS互相调用简易指南

这篇文章主要介绍了详解Flutter WebView与JS互相调用简易指南,分为JS调用Flutter和Flutter调用JS,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android开发实现ListView和adapter配合显示图片和文字列表功能示例

这篇文章主要介绍了Android开发实现ListView和adapter配合显示图片和文字列表功能,涉及Android使用ListView结合adapter适配器实现图文显示功能相关的布局、解析、权限控制等操作技巧,需要的朋友可以参考下
收藏 0 赞 0 分享

Android文字基线Baseline算法的使用讲解

今天小编就为大家分享一篇关于Android文字基线Baseline算法的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
收藏 0 赞 0 分享

Flutter自定义实现神奇动效的卡片切换视图的示例代码

这篇文章主要介绍了Flutter自定义实现神奇动效的卡片切换视图的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
收藏 0 赞 0 分享

Android实现自定义滑动刻度尺方法示例

这篇文章主要给大家介绍了关于Android实现自定义滑动刻度尺的相关资料,文中通过示例代码介绍的非常详细,对各位Android开发者们具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
收藏 0 赞 0 分享
查看更多