`
huaxin803
  • 浏览: 113339 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 装载器---使用LoaderManager的回调方法

 
阅读更多
LoaderManager.LoaderCallbacks是一个让客户与LoadManager进行交互的回调接口。
装载器,尤其是CursorLoader装载器,被期望用来保存被终止后的数据,这样就允许应用程序在Activity之间或Fragment的onStop()和onStart()方法之间进行切换时保存数据,以便在用户返回应用程序时,它们不需要因数据重载而等待。使用LoaderManager.LoaderCallbacks()的回调方法就知道在什么时候要创建一个新的装载器,并且告诉应用程序什么时候是终止使用装载器数据的时间。

LoaderManager.LoaderCallbacks接口包含以下方法:

1.onCreateLoader()---用给定的ID实例化并返回一个新的Loader对象;

2.onLoaderFinished()---当之前创建的装载器已经完成它的装载时,调用这个方法;

3.onLoaderReset()---当之前创建的装载器被重置时,调用这个方法,这样会使这个装载器的数据变的无效。

下面分别对这些方法进行详细说明。

onCreateLoader

当你想要访问一个装载器是时(例如,通过initLoader()方法),它会检查指定ID的装载器是否存在,如果不存在,它会触发LoaderManager.LoaderCallbacks的onCreateLoader()回调方法。这是创建一个新的装载器的地方,典型的是创建一个CursorLoader装载器,但是你能够实现你自己的Loader类的子类。

例如:

// If non-null, this is the current filter the user has provided.
String mCurFilter;
...
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // This is called when a new Loader needs to be created.  This
    // sample only has one Loader, so we don't care about the ID.
    // First, pick the base URI to use depending on whether we are
    // currently filtering.
    Uri baseUri;
    if (mCurFilter != null) {
        baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
                  Uri.encode(mCurFilter));
    } else {
        baseUri = Contacts.CONTENT_URI;
    }

    // Now create and return a CursorLoader that will take care of
    // creating a Cursor for the data being displayed.
    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");
}

在这个列子中,onCreateLoader()回调方法创建了一个CursorLoader装载器,你必须使用构造器方法来创建这个CursorLoader对象,它需要一整套执行对ContentProvider的查询所需要信息,具体需要如下:

1.uri---要获取的内容的位置(URI);

2.projection---一个要返回的列的列表,如果传递null,将返回所有的列,这样是低效的。

3.selection---一个要返回的行的过滤器声明,它使用SQL WHERE子句的格式(不包括WHERE关键字本身)。传递null时将返回给定URI的所有行数据。

4.selectionArgs---你可以在selection中包含“?”字符,这些字符将会被selectionArgs中的值顺序替换。这些值将作为字符串被绑定。

5.sortOrder---使用SQL ORDER BY子句的格式(不包括ORDER BY自己)指定行记录是如何排序的,如果传递null将会使用默认的排序,也可以是无序的。

onLoadFinished

当之前创建的装载器已经完成了它的加载时这个方法会被调用。在提供给这个装载器的最后的数据释放之前会保证调用这个方法。在这个时点你应该删除所有的对旧数据使用(因为数据即将被释放),但是你不应该自己做数据的释放,因为装载器本身会做这件事情。

装载器一旦知道应用程序不在使用它,就会释放数据。例如,如果数据是来自CursorLoader对象的一个游标,你不应该自己来调用close()方法,如果游标被放到了CursorAdapter中,你应该使用swapCursor()方法,以便旧的Cursor对象不被关闭。如:

// This is the Adapter being used to display the list's data.
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()方法实现这样的调用,如:

// This is the Adapter being used to display the list's data.
SimpleCursorAdapter mAdapter;
...

public void onLoaderReset(Loader<Cursor> loader) {
    // This is called when the last Cursor provided to onLoadFinished()
    // above is about to be closed.  We need to make sure we are no
    // longer using it.
    mAdapter.swapCursor(null);
}

注:本人转载系个人觉得翻译的很好,值得收藏,且自己回头看着方便。

如有兴趣请访问作者官方博客http://blog.csdn.net/FireOfStar

分享到:
评论

相关推荐

    android支持包:android-support-v4

    `android-support-v4`中的LoaderManager允许开发者在API级别7及以上的设备上使用Loader,确保数据的实时性和准确性,同时避免在配置改变时丢失数据。 **AppCompat库** `android-support-v4`库常常与AppCompat库...

    android-support-v4/v7 26 27 28三个版本下载

    - `LoaderManager`是异步数据加载的管理器,可以避免在配置改变时重新加载数据,提高了应用的响应性和用户体验。 2. **appcompat-v7库**: - `appcompat-v7`库的主要目的是为了让开发者能够在低版本Android设备上...

    android-support-v4-src源码

    在Android应用开发中,`android-support-v4`库是一个不可或缺的部分,它提供了对低版本Android系统的重要支持,使得开发者可以使用最新的API特性,而无需担心设备的兼容性问题。这个库包含了大量的类和方法,覆盖了...

    android-support-v4最新版.rar

    5. **BroadcastReceiver和Service的扩展**:库中还包括了对BroadcastReceiver和Service的扩展,使开发者可以创建兼容低版本Android的广播接收器和服务。 6. **AsyncTask**:在Android中,AsyncTask是一种方便的后台...

    Android下使用loaderManager

    本篇文章将详细探讨Android下如何使用LoaderManager以及它的核心概念。 首先,LoaderManager是Android框架的一部分,它在Activity和Fragment中提供了一种统一的方式来加载和刷新数据。LoaderManager遵循Loader的...

    老罗android视频开发源码和ppt--LoaderManager异步加载数据库.rar

    3. **LoaderManager.LoaderCallbacks**:这是一个回调接口,开发者需要在Activity或Fragment中实现这个接口,提供onCreateLoader()、onLoadFinished()和onLoaderReset()三个方法。这些方法会在Loader的不同阶段被...

    Android 中 Loader 及 LoaderManager 的使用

    Loader是Android框架提供的一种异步加载数据的机制,而LoaderManager则是用来管理Loader的组件,它使得在Activity或Fragment中更加方便地使用Loader。 Loader的出现主要是为了解决AsyncTask在数据持久化和生命周期...

    老罗Android入门到开发视频

    Android-01-入门介绍(9集) Android-02-常用UI布局介绍(5集) Android-03-百度地图实战开发(10集) Android-04-HTTP协议编程(4集) ...Android-14-LoaderManager异步加载数据库(2集) Android-15-多线程编程(7)

    android-support-v4.zip

    3. **使用Loader**:通过`LoaderManager`来启动和管理Loader,使用`LoaderCallbacks`接口实现Loader的生命周期回调。 4. **配置ViewPager**:创建`PagerAdapter`子类,如`FragmentPagerAdapter`或`...

    android-support-v7-appcompat+v4jar

    这个库包含了大量跨版本兼容的类和方法,使得开发者能使用一些在新版本Android中引入的功能,而无需担心低版本设备的兼容问题。 1. Fragment支持:v4.jar库中的Fragment类使得开发者能够在API级别11以下的设备上...

    android-support-v7-appcompat

    在Android开发中,`android-support-v7-appcompat`是一个至关重要的库,它是Android Support Library的一部分,为开发者提供了对Android API版本的向下兼容,使得开发者可以在低版本的Android系统上使用一些高版本...

    Android装载器的使用

    本篇文章将深入探讨Android装载器的使用,以及如何通过ContentProvider进行数据库的批量操作。 ### 装载器的基本概念 1. **Loader接口**:装载器是一个抽象接口,定义了数据加载的基本操作,包括初始化、启动、...

    Android回调函数的例子

    除了自定义回调,Android框架还提供了许多内置的回调机制,如`AsyncTask`的`onPostExecute`,`LoaderManager.LoaderCallbacks`的`onLoadFinished`等。这些回调方法使得开发者能够优雅地处理各种异步操作和生命周期...

    最新完整的android-support-v4

    v4库提供了对Fragment的全面支持,包括生命周期管理、动画和回退栈管理等,使得在早期Android版本上也能使用Fragment。 2. **Loader管理**:Loader接口提供了异步加载数据的能力,v4库中的LoaderManager则负责管理...

    android-support-v4源码

    通过阅读源码,我们可以学习到如何优雅地处理异步任务,以及线程同步和回调的机制。 5. **IntentService**:虽然IntentService不是直接在`v4`库中,但`v4`提供了`IntentCompat`类来支持IntentService在低版本...

    java和android中的回调

    3. **BroadcastReceiver**:广播接收器也是Android中的回调机制,它可以监听系统或自定义的广播事件,当广播事件发生时,`onReceive()`方法会被调用。 4. **Loader回调**:对于数据加载,LoaderManager提供了`...

    最新版的android-support-v4.jar

    **使用方法** 要使用Android Support Library v4,开发者需要将其添加到项目依赖中。在现代的Android Studio项目中,这通常是在build.gradle文件中添加相应的依赖项。例如: ```groovy dependencies { ...

    回调实例 Android

    在Android的网络请求库,如Volley、Retrofit或OkHttp中,也广泛使用了回调接口。这些库允许我们在网络请求成功或失败时执行相应的回调方法,比如Retrofit的`Call&lt;T&gt;.enqueue()`方法: ```java Call&lt;ResponseBody&gt; ...

    android回调demo

    例如,使用`LoaderManager.LoaderCallbacks`来管理数据加载,或者使用Retrofit库进行网络请求时设置回调。 总之,回调在Android开发中起着至关重要的作用,它使异步编程变得简单而有效。通过这个“android回调demo...

    android-support-v13.jar.zip

    Android Support Library是一系列的库,它们提供对某些新功能的后向兼容,使得开发者无需依赖特定的Android版本即可使用新特性。v13是其中的一个版本,主要关注的是对Fragment的支持和改进。 二、Fragment支持 ...

Global site tag (gtag.js) - Google Analytics