Android学习之AsyncTask和AsyncTaskLoader



AsyncTask

一、AsyncTask的介绍

AsyncTask是一个异步类,用来处理一些后台任务,并方便与UI thread交互,下面是原型:

public abstract class AsyncTask

三个泛型参数,即参数类型由用户自己定义,分别代表:

uParams:启动任务执行的输入参数。即用户调用task.execute(Params…)传入的参数,同时这个参数也会传给doInBackground函数

uProgress:后台任务执行的进度。当用户调用publishProgress时,用此作为参数,然后系统会将该参数回调给onProgressUpdate

uResult:后台计算结果的类型。这是doInBackground函数的返回值,同时也是onPostExecute的参数


关于asyncTask,一些注意的地方

Android学习之AsyncTask和AsyncTaskLoader_第1张图片

二、AsyncTask的使用

一个asyncTask一般有以下几个执行步骤:

1、创建一个task,并继承asyncTask

2、task.execute(params),在UI线程中调用

3、如果在asyncTask中实现了onPreExecute,在调用task.execute(params)后会立即调用该函数

4、doInBackground(params),在onPreExecute之后执行,一般做一些耗时操作,这个函数是asyncTask的主要部分,必须实现该函数,并且该函数在后台线程中调用

5、onProgressUpdate(progress),如果需要更新界面进度信息,一般应该在doInBackground中调用publishProgress(progress),然后会回调到onProgressUpdate函数,该函数是在UI线程中调用

6、onPostExecute(Result),在doInBackground返回后,该函数会被执行,Result是doInBackground的返回值,该函数在UI线程中调用,必须实现该函数

Note:

task.execute和task.executeOnExecutor()的区别是,executeOnExecutor用在多核处理器,这样系统会根据当前内核数量同时进行多个任务。

AsyncTaskLoader

从名字都可以得知,asyncTaskLoader一般用于后台的数据加载,它的使用方法一般如下:

1、创建用户自定义loader,让该loader继承asyncTaskLoader,并传入URI作为参数,以便后面根据URI去load数据

2、创建listener,这个listener实现Loader.onLoadCompleteListener类,并重载onLoadComplete方法

3、将listener类对象注册给loader,如loader.registerListener(listener)

4、调用loader.startLoading()开始执行loader,当数据load出来后,会回调到上面的onLoadComplete方法。


asyncTaskLoader与asyncTask的关系十分紧密,查看asyncTaskLoader类的源码可知,asyncTaskLoader继承了Loader对象,在类里面创建了一个asyncTask的对象,实际上asyncTaskLoader封装了asyncTask来实现更具体的功能,以下是asyncTaskLoader内部的执行流程:

1、当app调用startLoading时,会调用Loader类的startLoading,然后回调到用户自定义loader类的onStartLoading函数,用户在onStartLoading中必须主动调用forceLoad()函数。

2、调用forceLoad()后,会调用到系统Loader类的forceLoad()函数,然后会回调到asyncTaskLoader类的onForceLoad,在里面会创建asyncTask,并调用doInBackground和onPostExecute,在doInBackground会回调到用户自定义loader类的loadInBackground,在onPostExecute中会回调到用户自定义loader类的deliverResult

3、在用户自定义loader的loadInBackground,一般会根据URI去load数据

4、在用户自定义loader的deliverResult,会调用系统Loader的deliverResult

5、在系统loader的deliverResult,会回调到用户重载的onLoadComplete函数中,至此asyncTaskLoader的任务完成,onLoadComplete的参数中将获取数据库的数据


asyncTaskLoader的内部执行流程可用下图表示

Android学习之AsyncTask和AsyncTaskLoader_第2张图片




你可能感兴趣的:(android)