简介
在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
完成数据加载后会回调LoaderInfo
的onLoadComplete()
方法。
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;
}
外部就是通过调用Loader
的registerListener()
方法将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开发来说是这样),那就从MainActivity
的onCreate()
来看起吧。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这里假设面包房刚开门的时候已经有9个人在排队了。
mNeededBreads = 9;
mBaker = new Baker(