AsyncTask源码分析

  • 时间:
  • 浏览:0

finish的作用是将会task被取回了就执行onCancelled土办法,将会没哟被取回却说我正常执行完毕,则执行onPostExecute 土办法(这也是为有哪些task被调用了cancel土办法,无需执行onPostExecute的由于)。最后将task的情况标记为FINISHED。

由FutureTask源码亲戚人们能不可不还可不后能 看出,run()土办法后边调用了c.call(),而AsyncTask 中创建FutureTask的日后传入了mWorker,所以有FutureTask.run()土办法后边c.call()调用的是mWorker对象的 call()土办法,而AsyncTask里mWorker重写了call土办法,即后边8-14行,所以有c.call()会执行到 mWorker.call()土办法来。call土办法后边11行将任务管理器的优先级设置为后台任务管理器,原来当多个任务管理器并发后所以与否关紧要的任务管理器分配的CPU时间将 会减少,利于主任务管理器的处理。

FutureTask代码:

publishProgress土办法最终也会通过sHandler来调用AsyncTask的onProgressUpdate土办法,一般亲戚人们将会需要获取进度说说都需要重写AsyncTask的onProgressUpdate。

顺便提一下,在AsyncTask的doInBackground土办法中将会需要更新UI说说,则调用AsyncTask的publishProgress土办法即可:

AsyncTask构造土办法:

由下面代码能不可不还可不后能 看出,AsyncTask有这一情况:PENDING(未运行)、RUNNING(正在运行)、FINISHED(已运行完毕)。

最终会执行finishCompletion()土办法。

execute土办法后边直接调用了executeOnexecute土办法。

3-13行是检测AsyncTask的情况,将会情况不为PENDING,则会抛异常,这也是为有哪些另有两个 AsyncTask不可不还可不后能 被执行一次的由于。14行将情况改为RUNNING,表示该任务正在运行。有日后调用AsyncTask的onPreExecute()土办法。

关于AsyncTask的用法能不可不还可不后能 参看前面一篇博客《AsyncTask实现断点续传》,本文只解析AsyncTask的源代码。

接下来11行执行了doInBackground(mParams)土办法,通常亲戚人们会重写该土办法来实现业务逻辑操作。有日后执行postResult 土办法,有日后将结果返回给FutureTask(将会是FutureTask.run土办法调用的此call土办法,所以有需要返回结果到 FutureTask.run土办法)。这里亲戚人们先看看postResult:

看一遍21行代码,会执行FutureTask的done()土办法,而这一土办法在AsyncTask构造函数中初始化FutureTask对象的日后被重写了。

这里主却说我验证postResult与否被调用了,将会没哟被调用着调用postResult函数,将会前面mWorker.call土办法后边调用过了,所以有这里不错操作。

AsyncTask.executeOnexecute土办法:

由后边代码能不可不还可不后能 看一遍,执行完c.call后,会执行set(result)土办法。

由第9行代码可知最终会执行AsyncTask的finish土办法,代码如下:

后边说到mWorker.call会将执行结果返回给FutureTask.run()土办法有日后继续往下执行,亲戚人们再次看看FutureTask.run土办法(20-500行):

AsyncTask.execute土办法:

这里的sHandler是InternalHandler对象。

好了,AsyncTask的源码也分析完了。再次总结一下Asynctask使用的注意事项: