1 | /** |
mWorker是个Callable对象,用来在子线程中执行doInBackground()内的耗时操作
mFuture是FutureTask对象,通过重写done()方法,获取doInBackground()的执行结果。并通过 postResultIfNotInvoked(get())将执行结果发送给主线程。
注意,done()方法仍然是在子线程中执行的,所以不会其内部调用get()方法,不会阻塞主线程
1 | private void postResultIfNotInvoked(Result result) { |
postResultIfNotInvoked() 实质上是利用Android的Handler机制进行线程切换。getHandler()所得到的Handler对象关联的是主线程的消息队列。progress信息也是通过这个Handler传给主线程的。
1 | private static volatile Executor sDefaultExecutor = SERIAL_EXECUTOR; |
AsycTask采用了重新定义的SerialExecutor类,虽然采用了线程池,但是由于总是run()之后调用scheduleNext(),导致任务也单线程排队的方式执行。而且这种排队是全局性的。所以AsycTask并不适合执行长时间的任务,否则会导致后续任务长时间排队,无法及时获取结果。
Tips:
1、AsycTask默认采用单线程排队的方式执行,不适合执行长时间的任务,否则会导致后续任务长时间排队,无法及时获取结果。(当然可以进行配置的)