AsyncTask详解

请你讲解一下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等方法在子线程中执行
知识有限,有错漏出请见谅,希望能指出改正。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值