请你讲解一下handler和AsyncTask的原理,android面试时必问问题。
今天我们来说说异步任务,为嘛,里面有些方法在主线程,有些方法在子线程,这种怎么做到的嘞?为嘛AsyncTask不能在子线程中创建执行?为什么执行过一次后就不能在执行。
首先我们来看构造函数
首先构造里面new了一个WorkerRunnable,这是一个什么鬼?它是个Runnable吗?
我看到他的声明,这是AsynscTask里面的一个静态抽象内部类 实现了Callable接口,这个Callable 是什么呢?
看一下文档,原来这是一个类似于Runnable 的东西(>The {@code Callable} interface is similar to {@link * java.lang.Runnable})
这个也是用来设计被一个线程调用的,这个call方法就和run方法一样,执行后还会返回结果。
我们在回去看构造里面定义的WorkerRunnable,见到在里面看到我们一个熟悉的方法doInBackground(mParams)
原来就在这里这个子线程去处理doInBackground方法
我们看完构造,在来看execute方法
结果发现它调用的另外一个方法
我们可以看到,当状态是执行状态或者结束了,它就抛异常,不让继续执行了。继续往下走开启线程池的线程,并把状态设置成运行,假如要AsynscTask在子线程执行,那onPreExecute方法就在子线程中处理了,不能去显示对话框了。
开始执行子线程。
子线程执行,线程处理完成在做啥嘞,我们继续看构造方法里面
从前面的线程里面拿到结果 Result,然后处理。
这时我们看到一个熟悉的东西,Message,把结果发送给Handler
这时看handler
一个静态的内部类InternalHandler,设置Loop为Looper.getMainLooper() 让主线程去处理看消息处理的地方,看到个熟悉的东西finish方法和onProgressUpdate方法。
咦onPostExecute方法哪里去了
在这里,在finish方法里面。
这里面有个用handler 用的比较帅的方法,
他把AsyncTask 和子线程结果一起作为消息发送给了handler ,然后在handler的handleMessage方法调用来保证onProgressUpdate,onPostExecute,onCancelled等方法在子线程中执行
知识有限,有错漏出请见谅,希望能指出改正。