AsyncTask更新UI线程的基本原理

  1. 首先异步任务作的作多的用来更新UI,至于怎样来跟UI线程进行交互的,咱们从源码看起。当咱们new AsyncTask<Params, Progress, Result>.execute(),时,会执行AsyncTask的构造方法,而后执行execute()方法。咱们来看看构造方法:android

WorkerRunnable是一个抽象内部类,implements一个interface,call()方法是在接口中定义的。咱们须要注意的是它return的地方,postResult(doInBackground(mParams))。doInBackground(mParams),咱们太熟悉了,这里面执行耗时操做,返回一个result做为onPostExecute(Object result)的参数。咱们来看一下postResult()方法里作了什么异步

好吧,这里面,咱们也很熟悉。这是message对消息进行封装。sendToTarget()方法中有一行代码,target.sendMesaage(this),毫无疑问,这个target就是Handler的实例。因此,call()方法中执行了doInBackground()方法,并经过handler发送了MESSAGE_POST_RESULT的消息。那接下来咱们看看handler接收消息作了什么:post

从上面的代码,能够看出,Hander接收消息后,执行了onPostExecute()方法,这个方法咱们一样很熟悉。构造方法咱们看到这,接下来咱们看看AsyncTask类中excute()方法中执行了哪些操做。this

execute()方法中执行了executeOnExecutor()方法,咱们来看看这个方法里作了什么。首先,状态改成RUNNING,保证每一个AsyncTask实例只执行一次,android3.0之后默认采用单线程模式。oPreExecute()这个方法咱们也很熟悉,通常用来显示进度条的。mWorker.mParams = params。mWorker是WorkerRunnable的实例。WorkerRunnable是一个抽象的内部类,实现Callable接口,定义了一个mParams变量。毫无疑问,为call()方法中的doInBackground()方法的参数传值。最后是,exec.execute(mFuture).线程

mTasks是个存放Runnable的队列,scheduleNext()执行线程池中的线程。重点来看r.run(),r是执行excute()方法传递的参数,这个参数是mFuture,是FutureTask的实例。看看run()里面作了什么:对象

run()方法调用内部类Sync中的innerRun()方法,这个方法中咱们来看被标记的这行代码。这里callable是WorkerRunnable的对象,执行了WorkerRunnable继承的接口Callable中的call()方法。咱们知道call()方法的返回值是postResult(doInBackground(mParams)),这个上面已经介绍过了。好了,彷佛一切线索都串联起来了。继承

简单来总结一下,当咱们执行new AsyncTask(Params,Progress,Result).excute()时,AsyncTask的构造方法实现了Callable接口中的call()方法,而后excute()方法中执行了onPreExecute()方法,调用了call()方法,执行了doInBackGground()方法,返回值result被message封装,而且对message的状态设为MESSAGE_POST_RESULT,经过handler发送出去。handlerMessage()接收到消息后,先对message的状态值进行判断,执行相应操做。这里返回的是MESSAGE_POST_RESULT,对应的finish()方法中执行了onPostExecute()方法。咱们能够在onPostExecute()方法中添加对UI的操做。接口

相关文章
相关标签/搜索