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的查询.

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

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 Loader详解四:回调及完整例子的更多相关文章

  1. Android Loader详解三:重启与回调

    重启装载器 当你使用initLoader()时,如果指定ID的装载器已经存在,则它使用这个装载器.如果不存在呢,它将创建一个新的.但是有时你却是想丢弃旧的然后开始新的数据. 要想丢弃旧数据,你应使用r ...

  2. Android Loader详解

    装载器从android3.0开始引进.它使得在activity或fragment中异步加载数据变得简单.装载器具有如下特性: 它们对每个Activity和Fragment都有效. 他们提供了异步加载数 ...

  3. Android loader 详解

    装载器从android3.0开始引进.它使得在activity或fragment中异步加载数据变得简单.装载器具有如下特性: 它们对每个Activity和Fragment都有效. 他们提供了异步加载数 ...

  4. Android Loader详解一:概述

    装载器从android3.0开始引进.它使得在activity或fragment中异步加载数据变得简单.装载器具有如下特性: 它们对每个Activity和Fragment都有效. 他们提供了异步加载数 ...

  5. Android Loader详解二:使用加载器

    一个使用装载器的应用会典型的包含如下组件: 一个Activity或Fragment. 一个LoaderManager的实例. 一个加载被ContentProvider所支持的数据的CursorLoad ...

  6. (转)android Fragments详解四:管理fragment

    要管理fragment们,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager(). 你可以用FragmentManager来做以上事情: ...

  7. Android Fragment详解(四):管理Fragment

    要管理fragment们,需使用FragmentManager,要获取它,需在activity中调用方法getFragmentManager(). 你可以用FragmentManager来做以上事情: ...

  8. Android菜单详解(四)——使用上下文菜单ContextMenu

    之前在<Android菜单详解(二)——创建并响应选项菜单>和<Android菜单详解(三)——SubMenu和IconMenu>中详细讲解了选项菜单,子菜单和图标菜单.今天接 ...

  9. Android进阶(十四)Android Adapter详解

    Android Adapter详解 Android是完全遵循MVC模式设计的框架,Activity是Controller,layout是View.因为layout五花八门,很多数据都不能直接绑定上去, ...

随机推荐

  1. CSS 的选择符

    CSS是什么? 如果说元素是标记代码的构建块料,那么CSS就是约束这些构建块料样式的规则. CSS规则的组成 CSS的规则由 选择符 和属性,值组成. Css选择符:选择符是规则中用于确定样式所涵盖的 ...

  2. js 实现图片旋转角度

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 10.08_逛逛OSC

    (1)每天逛逛OSC是我的习惯了. JNative.JACOB.Shrinkwrap  API? .Lua.WSO2 Identity Server .JBoss Forge.Bugzilla.Cou ...

  4. Libnids---编写网络应用程序的利器

    一.前言 Libnids是一个用于网络入侵检测开发的专业编程接口,它使用Libpcap进行数据包的捕获.同时,Libnids提供了TCP/IP数据流重组功能,因此省去了应用层自己考虑数据分片.重传等情 ...

  5. Java Servlet 回顾

    一.转发请求RequestDispatcher 使用request域对象把数据带给转发资源,与重定向的区别:客户端只发出一次请求,服务器端调用多个资源,客户端浏览器地址栏没改变:转发是一次请求,使用的 ...

  6. 获取DOM的真实节点

    <script type="text/babel"> var Myelement=React.createClass({ handleClick:function(){ ...

  7. DIV+CSS 网页布局之:混合布局

    1.混合布局 在了解了一列.两列和三列布局之后,混合布局也就不难理解了,混合布局也可以叫综合型布局,那么混合布局就可以在一列布局的基础之上,分为两列布局,三列布局,网页布局的结构普遍都是三列布局,但是 ...

  8. sonar-maven-plugin错误2

    From maven-sonar-plugin 2.7, SonarQube < 4.5 is no longer supported. If using SonarQube instance ...

  9. linux命令之chown命令

    发布:JB01   来源:脚本学堂     [大 中 小] 本文介绍下,linux系统中用于文件与目录权限管理的命令 chown命令的用法,chown将指定文件的拥有者改为指定的用户或组.有需要的朋友 ...

  10. 前端工程的构建工具对比 Gulp vs Grunt

    1. Grunt -> Gulp 早些年提到构建工具,难免会让人联想到历史比较悠久的Make,Ant,以及后来为了更方便的构建结构类似的Java项目而出现的Maven.Node催生了一批自动化工 ...