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 }, );
setListAdapter(mAdapter); // 准备loader.可能是重连到一个已存在的或开始一个新的
getLoaderManager().initLoader(, 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(, 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的更多相关文章

  1. 【Android Developers Training】 99. 获取联系人详细信息

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 98. 获取联系人列表

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. [Android Pro] Android异步任务处理之AsyncTaskLoader的使用

    reference to : http://blog.csdn.net/happy_horse/article/details/51518280 最近项目中涉及到加载本地的地名.db文件,数据量大,自 ...

  4. Android 常用布局视图

    常用包 http://square.github.io/ EventBus Scroller 滚动 拖拽 # android.support.design.widget.CollapsingToolb ...

  5. 【Bugly干货】Android性能优化典范之多线程篇

    本文涉及的内容有:多线程并发的性能问题,介绍了 AsyncTask,HandlerThread,IntentService 与 ThreadPool 分别适合的使用场景以及各自的使用注意事项,这是一篇 ...

  6. Android Loader使用详解

    1.CursorLoader使用Demo public class MainActivity extends Activity implements  LoaderManager.LoaderCall ...

  7. 我理解的Android加载器

    Android的加载器(loader)是从Android 3.0开始出来的东西.要理解这里需要先理解为什么会出现加载器(也有地方把它说成是装载器)呢? 如果没有加载器... 首先Activity是我们 ...

  8. Android开发权威指南(第2版)新书发布

    <Android 开发权威指南(第二版)>是畅销书<Android开发权威指南>的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45 章精彩内容供 ...

  9. Android之数据存储----使用LoaderManager异步加载数据库

    一.各种概念: 1.Loaders: 适用于Android3.0以及更高的版本,它提供了一套在UI的主线程中异步加载数据的框架.使用Loaders可以非常简单的在Activity或者Fragment中 ...

随机推荐

  1. PAT-中国大学MOOC-陈越、何钦铭-数据结构基础习题集 00-自測4. Have Fun with Numbers (20) 【二星级】

    题目链接:http://www.patest.cn/contests/mooc-ds/00-%E8%87%AA%E6%B5%8B4 题面: 00-自測4. Have Fun with Numbers ...

  2. 18.链表管理内存实现c语言自动释放内存

    运行截图: 创建记录分配的内存地址大小和地址的结构体 struct MEM { void *p; int size; }; 创建管理内存结构体的链表 typedef struct LinkNode { ...

  3. POJ 3170 线段树优化DP

    题意: 思路: 先搞一个vector 存以T2结尾的结构体 (结构体里面有开始工作的时间和花费) f[i]表示取区间[M,i)的代价 易得f[i]=min(f[k]+w,f[i]);T1<=k ...

  4. Spark MLlib协同过滤算法

    算法说明 协同过滤(Collaborative Filtering,简称CF,WIKI上的定义是:简单来说是利用某个兴趣相投.拥有共同经验之群体的喜好来推荐感兴趣的资讯给使用者,个人透过合作的机制给予 ...

  5. GetInvocationList 委托链表

    最近发现C#程序初始化时在构造函数中,偶尔出现事件注册不成功.后查资料发现有GetInvocationList 这么一个获取类中的委托链表的函数, 使用方法如下: 1.在需委托的类(Class1)中增 ...

  6. HDU——T 2594 Simpsons’ Hidden Talents

    http://acm.hdu.edu.cn/showproblem.php?pid=2594 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  7. 使WordPress改域名后网站正常运行的方法

    使WordPress改域名后网站正常运行的方法 wp-content/wp-config.php $path = '/blog'; $scheme = (isset($_SERVER['HTTPS'] ...

  8. eclipse- 智能提示设置

    最近自己ubuntu 下的eclipse没办法只能提示了.后来在网上查了方法,完美解决了问题 1.java代码编辑的时候不提示 具体如下 Windows→Preferences→Java→Editor ...

  9. 新技能 get —— 如何校验 md5(windows)

    我们在某资源网站上下载完成指定文件后,尤其是一些下载所需较高时长的大型文件,如何检验下载的文件是否完好,也即如何保证和原始网站上的资源一样.此时就要用到检验码的机制,一般文件的下载界面,通常都会给出此 ...

  10. ByteUtils

    package sort.bing.com; import java.io.ByteArrayOutputStream;import java.io.DataOutputStream;import j ...