全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android onLoadFinished与onLoaderReset回调详解及实例

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  # onLoadFinished与onLoaderReset回调  # 回调实例  # 加载  # 这是  # 将被  # 它将  # 创建一个  # 回调  # 有一个  # 的是  # 是一个  # 是在  # 你可以  # 将在  # 在此  # 什么时候  # 会在  # 希望能  # 使用它  # 使其  # 作为一个  # 不应 


相关文章: ,石家庄四十八中学官网?  建站之星安装模板失败:服务器环境不兼容?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  建站之星如何实现五合一智能建站与营销推广?  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  如何用VPS主机快速搭建个人网站?  建站之星北京办公室:智能建站系统与小程序生成方案解析  学校建站服务器如何选型才能满足性能需求?  建站主机系统SEO优化与智能配置核心关键词操作指南  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  教学论文网站制作软件有哪些,写论文用什么软件 ?  javascript中的try catch异常捕获机制用法分析  头像制作网站在线制作软件,dw网页背景图像怎么设置?  在线制作视频的网站有哪些,电脑如何制作视频短片?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  寿县云建站:智能SEO优化与多行业模板快速上线指南  如何在云主机上快速搭建网站?  建站之星微信建站一键生成小程序+多端营销系统  怀化网站制作公司,怀化新生儿上户网上办理流程?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  模具网站制作流程,如何找模具客户?  PHP 500报错的快速解决方法  建设网站制作价格,怎样建立自己的公司网站?  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  如何选择网络建站服务器?高效建站必看指南  建站之星会员如何解锁更多建站功能?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  建站为何优先选择香港服务器?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  佛山企业网站制作公司有哪些,沟通100网上服务官网?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  广州营销型建站服务商推荐:技术优势与SEO优化解析  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  建站之星在线版空间:自助建站+智能模板一键生成方案  北京网站制作网页,网站升级改版需要多久?  如何快速生成ASP一键建站模板并优化安全性?  Swift中swift中的switch 语句  深圳网站制作的公司有哪些,dido官方网站?  建站主机核心功能解析:服务器选择与网站搭建流程指南  如何在服务器上配置二级域名建站?  如何选择适配移动端的WAP自助建站平台?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何获取上海专业网站定制建站电话?  如何通过NAT技术实现内网高效建站?  Thinkphp 中 distinct 的用法解析  魔毅自助建站系统:模板定制与SEO优化一键生成指南 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。