AsyncTaskLoader设计原理大揭秘

本文详细介绍了Android中AsyncTaskLoader的设计原理和运行流程,包括Loader接口、AsyncTaskLoader类、LoaderInfo以及LoaderManager的角色。通过类图展示了它们之间的关系,并通过面包店的比喻帮助理解。文章还梳理了从初始化到数据加载完毕的完整步骤,揭示了AsyncTaskLoader如何配合Activity或Fragment的生命周期管理数据加载。
摘要由CSDN通过智能技术生成

简介

Android异步处理之AsyncTaskLoader简单使用中我简单的介绍了一下AsyncTaskLoader的基本用法和使用场景,对AsyncTaskLoader还不是很熟悉的小伙伴可以先简单学习一下。

相信读过Android异步处理之AsyncTaskLoader简单使用后,大家对烤面包机,面包师,面包房的例子还是有点印象的,那么接下来趁热打铁,继续沿用这个买面包的例子讲述一下AsyncTaskLoader的设计原理。

设计原理

在讲设计原理之前,先简单了解一下AsyncTaskLoader的父类Loader

    A class that performs asynchronous loading of data. While Loaders are active they should monitor the source of their data and deliver new results when the contents change. See LoaderManager for more detail. 

简单理解一下Loader就是用来异步加载数据的,当Loader处于活动状态的时候需要监视数据并且在数据发生改变时加载和分发新的数据。在上述描述中我们还发现了LoaderManager这个对象,正是因为有了它,Loader才具有生命力。

下面看一下LoaderManager的简单介绍:

   Interface associated with an Activity or Fragment for managing one or more Loader instances associated with it. This helps an application manage longer-running operations in conjunction with the Activity or Fragment lifecycle; the most common use of this is with a CursorLoader, however applications are free to write their own loaders for loading other types of data. While the LoaderManager API was introduced in HONEYCOMB, a version of the API at is also available for use on older platforms through FragmentActivity. See the blog post Fragments For All for more details. 

简单理解一下就是说LoaderManager是配合着Activity,Fragment的生命周期来管理Loader

接下来用一张类图来简单展示一下Loader,AsyncTaskLoader,AsyncTask,LoaderManager,Activity之间的关系

图-1 相关类之间的关系
类关系图

接口

1.OnLoadCompleteListener

被声明在Loader中,用于Loader加载完数据后回调,从上图可以看出LoaderInfo实现了这个接口,说明当Loader完成数据加载后会回调LoaderInfoonLoadComplete()方法。

2.LoaderCallbacks

被声明在LoaderManager中,从上图的LoaderInfo中可以看到mCallbacks这个变量,它便是LoaderCallbacks的引用,用于当Loader加载完数据后回调上面提及的onLoadComplete(),最终回调onLoadFinished()方法将最新加载的数据传递给客户端。

1.Loader

抽象类负责定义相关接口和约束。其变量mListener就是加载完数据的回调。那具体是如何回调的呢?答案就在deliverResult()方法中

Loader.java
--------------------------
    public void deliverResult(D data) {
        if (mListener != null) {
            mListener.onLoadComplete(this, data);
        }
    }

再看registerListener()方法:

Loader.java
--------------------------
    public void registerListener(int id, OnLoadCompleteListener<D> listener) {
        if (mListener != null) {
            throw new IllegalStateException("There is already a listener registered");
        }
        mListener = listener;
        mId = id;
    }

外部就是通过调用LoaderregisterListener()方法将OnLoadCompleteListener接口注册进来的。

2.AsyncTaskLoader

继承自Loader,其中变量mTask正是AsyncTask类型,这里也论证了Android异步处理之AsyncTaskLoader简单使用中的说法,将AsyncTaskLoader比作面包师的话AsyncTask就是烤面包机的说法。AsyncTaskLoader中就是通过AsyncTask来完成异步加载数据这个操作的。

3.LoaderInfo

LoaderInfo其实是对Loader的一个封装,它掌握了Loader一系列的工作状态如:

LoaderInfo.java
-----------------------------
 boolean mHaveData;
 boolean mDeliveredData;
 Object mData;
 boolean mStarted;
 boolean mRetaining;
 boolean mRetainingStarted;
 boolean mReportNextStart;
 boolean mDestroyed;
 boolean mListenerRegistered;

还有一系列的动作指令:

LoaderInfo.java
-----------------------------
void start() {...}
void retain() {...}
void reportStart() {...}
void stop() {...}
void cancel() {...}
void destroy() {...}
4.LoaderManager和LoaderManagerImpl

LoaderManager定义了作为Loader的管理者应该有哪些操作,而LoaderManagerImpl则具体实现这些操作。如果说把Loader比作面包师的话,那LoaderManager就算是面包店的老板吧,厨师什么时候该上班,什么时候该下班都由他管。
其中mLoaders变量为一个数组,用于保存 多个Loader这也说明了一个面包店可以有多个面包师负责制作不同类型的面包如:
不同的面包种类
这么多种类的面包如果让一个面包师来做我看他也会累的够呛。

运行流程梳理

在接下来的几步中有任何的疑惑都可以回过头看看【图1】。

1

那么了解上述这些类是干嘛的以后我们就来看看当这些个类运行起来是一个怎样的流程吧。
我们还是接着Android异步处理之AsyncTaskLoader简单使用中的例子来讲。一切起源起于onCreate()(至少对于APP开发来说是这样),那就从MainActivityonCreate()来看起吧。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //这里假设面包房刚开门的时候已经有9个人在排队了。
        mNeededBreads = 9;
        mBaker = new Baker(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值