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);  }  
}  

 

转载于:https://www.cnblogs.com/zhujiabin/p/6400226.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HA机制的大数据集群的搭建过程

文章目录集群规划1、 准备Linux环境1.1、修改Linux主机名1.3、修改主机名和IP的映射关系1.4、关闭防火墙1.5、ssh免登陆&#xff08;主节点和从节点之间&#xff09;2、 安装JDK2.1、上传2.2、解压jdk2.3、将java添加到环境变量中2.4、刷新配置2.5、验证3、安装zookeeper3.1、解…

Linux系统7个运行级别图文详解

Linux系统7个运行级别图文详解 当安装linux操作系统时将选择下列那一个操作 ______ A&#xff0e;选择 "图形登录方式" 设定系统开始运行级为4 B&#xff0e;选择 "文本登录方式" 设定系统开始运行级为3 C&#xff0e;选择 "文本登录方式" 设定系…

CRISPR基因编辑

2007年&#xff0c;一家酸奶公司发现一种细菌拥有抵御病毒的特殊防御机制。2012年&#xff0c;细菌的这种机制就被科学家阐述清楚&#xff0c;2013年这一领域快速增长。它被视为分子生物学的一个奇迹&#xff0c;事实上&#xff0c;它并非仅对生物学家产生革命的影响&#xff0…

酒店之王

酒店之王 题目描述 XX酒店的老板想成为酒店之王&#xff0c;本着这种希望&#xff0c;第一步要将酒店变得人性化。由于很多来住店的旅客有自己喜好的房间色调、阳光等&#xff0c;也有自己所爱的菜&#xff0c;但是该酒店只有p间房间&#xff0c;一天只有固定的q道不同的菜。 有…

使用IntelliJ IDEA碰到的问题总结

文章目录问题一&#xff1a;无法创建Java Class文件问题一&#xff1a;无法创建Java Class文件 今天打开项目时&#xff0c;发现右击新建不了java.class文件&#xff0c;于是尝试了以下方法&#xff1a; &#xff08;1&#xff09;选择 File——>Project Structure——>…

为什么shell脚本第一行要#!/bin/sh

告诉操作系统, 此脚本的解释器为 /bin/sh 这个可执行文件 类似地, 如果你的脚本用 bash, ksh, 解释, 第一行就应该是#!/bin/bash #!/bin/ksh 之类的 或者, 你自己定义一种脚本语言, 再自己写个解释器去执行它, 比如说叫 xshell, 放在 /usr/local/bin 下, 你的脚本第一行就应该是…

linux文本处理常用指令总结

引子 作为一个偏爱windows的程序员&#xff0c;以前做文本处理的时候总是喜欢在windows下用notepad等图形化工具处理&#xff0c;比如有时需要把linux服务器上一个文件进行一次全局字符串替换这样简单的操作&#xff0c;还得把文件down到本地编辑好再传回去。这两天买了本《鸟哥…

CSS——基础选择器

CSS的基础选择器1 CSS指的是层叠样式表2 CSS规则由两个主要的部分构成选择器&#xff0c;以及一条或多条声明3 选择器通常是你需要改变样式的 HTML 元素如h14 每条声明由一个属性和一个值组成&#xff0c;每个属性有一个值&#xff0c;属性和值被冒号分开5 属性大于 …

Linux中chown和chmod的区别和用法

chmod修改第一列内容&#xff0c; chown修改第3、4列内容&#xff1a; chown用法&#xff1a; 用来更改某个目录或文件的用户名和用户组。 chown 用户名:组名 文件路径&#xff08;可以是绝对路径也可以是相对路径&#xff09; 例1&#xff1a;chown root:root /tmp/tmp1 就…

玩大数据期间碰到的一些问题总结

文章目录问题一&#xff1a;Zookeeper节点数量为什么建议是奇数个&#xff1f;问题二&#xff1a;HA机制的Hadoop集群中Journal Node 作用问题三&#xff1a;两个datanode节点互相排斥怎么解决&#xff08;集群无法识别新加入的Datanode&#xff09;&#xff1f;问题四&#xf…

JAVA的SSH框架登录注册

Struts 的MVC设计模式可以使我们的逻辑变得很清晰&#xff0c;主要负责表示层的显示。 Spring 的IOC和AOP可以使我们的项目在最大限度上解藕。 hibernate的就是实体对象的持久化了, 数据库的封装。 项目截图&#xff1a;(代码是按照项目截图上传的&#xff0c;直接对号入座即可…

Visual Studio Code 前端调试不完全指南

本文最初发布于我的个人博客&#xff1a;咀嚼之味Visual Studio Code (以下简称 vscode) 如今已经代替 Sublime&#xff0c;成为前端工程师们最喜爱的代码编辑器。它作为一个大型的开源项目&#xff0c;不断推陈出新&#xff1b;社区中涌现出大量优质的插件&#xff0c;以支持我…

MySQL中(delete、truncate、drop) 的区别

delete、truncate、drop的用法 MySQL 数据表中delete删除数据的通用语法&#xff1a; ###删除 students_tbl 表中 student_id 为3 的记录&#xff1a; delete from students_tbl where student_id3; MySQL 数据表中truncate删除数据的通用语法&#xff1a; ###删除 students_…

机器学习之LDA主题模型算法

文章目录1、知道LDA的特点和应用方向1.1、特点1.2、应用方向2、知道Beta分布和Dirichlet分布数学含义3、了解共轭先验分布4、知道先验概率和后验概率5、知道参数α值的大小对应的含义6、掌握LDA主题模型的生成过程7、知道超参数α等值的参考值8、LDA总结1、知道LDA的特点和应用…

分别写出引入CSS的3种方式, 特点, 优先级

第一&#xff1a;css的三种引入方式 1.行内样式 最直接最简单的一种&#xff0c;直接对HTML标签使用style""&#xff0c;例如&#xff1a; <p style"color:#F00; "></p> 缺点&#xff1a;HTML页面不纯净&#xff0c;文件体积大&#xff0c…

[Go] Template 使用简介

Golang 提供了两个标准库用来处理模板 text/template 和 html/template。我们使用 html/template 格式化 html 字符。 模板引擎 模板引擎很多&#xff0c;Python 的 jinja&#xff0c;nodejs 的 jade 等都很好。所谓模板引擎&#xff0c;则将模板和数据进行渲染的输出格式化后的…

内存泄露监测

2019独角兽企业重金招聘Python工程师标准>>> iOS 内存泄露监测 144 作者 谢谢生活 已关注 2017.05.19 17:38* 字数 4235 阅读 209评论 0喜欢 6 iOS可能存在的内存泄露&#xff1a;block 循环引用。当一个对象有一个block属性&#xff0c;而block属性又引用这个对象…

玩Azkaban跳过的坑

文章目录一号坑&#xff1a;启动Azkaban报错&#xff1a;User xml file conf/azkaban-users.xml doesnt exist.二号坑&#xff1a;报错&#xff1a;failed SslSocketConnector0.0.0.0:8443: java.io.FileNotFoundException: /home/hadoop/app/azkaban/azkaban-web-2.5.0/bin/ke…

两种解除禁止右键、选中、复制的方法

我在网上找的 两种解除禁止右键、选中、复制的方法 1、直接存到书签点击即可 javascript:(function(){var docdocument;var bddoc.body;bd.onselectstartbd.oncopybd.onpastebd.onkeydownbd.oncontextmenubd.onmousemovebd.onselectstartbd.ondragstartdoc.onselectstartdoc.o…

删除节点removeChild()

http://www.imooc.com/code/1700 删除节点removeChild() removeChild() 方法从子节点列表中删除某个节点。如删除成功&#xff0c;此方法可返回被删除的节点&#xff0c;如失败&#xff0c;则返回 NULL。 语法: nodeObject.removeChild(node) 参数: node &#xff1a;必需&…