AsyncTask异步任务

(以下仅代表个人观点)

一,为什么要用AsyncTask

UI主线程主要用于与用户交互,非UI操作在UI主线程执行的时候回容易引起ANR典型错误,为了防止线程阻塞,非UI操作执行的时候要在自定义的线程里面执行,同时要注意,非UI线程是不可以直接访问UI组件的。

因此要解决非UI线程与UI主线程之间的交互,即可采用Handler;也可以采用AsyncTask。

AsyncTask的优点:不需要借助新的线程,不需要通过Handler。

这里说的不需要新的线程我个人认为是一种假象,实际上AsyncTask是通过借助后台线程来执行相应的操作,然后再返回结果给UI主线程,只是不需要我们自己创建。

二,AsyncTask的分析

AsyncTask本身是一个抽象类,它的父类是Object。AsyncTask<Params,Progress,Result>是它的全貌。根据官方API说法,三个泛型参数,四个步骤。

1,三个泛型参数:

Params启动任务执行所输入的参数类型

Progress后台任务完成的进度值得类型

Result后台任务执行完毕之后所返回的值的类型

对于这三个参数,我们要结合相应的方法来看,这里只是简单说明它上对应是个什么东西。

2,四个步骤;(在真正写的时候第一个步骤其实应该是先要创建AsyncTask的子类,注意其中要为三个泛型参数指定相应的类型,如果不需要那么指定为void)1,onPreExecute(),:这个方法其实是在任务开始执行前被调用,通常用来给任务做初始化的准备,例如在UI界面显示进度条。所以要注意它是在UI主线程中执行的。

2,doInBackground(Params...), 这是一个抽象方法,也就是说在这个类里面必须要实现的方法。注意它的参数,其实就是上面泛型参数的第一个,Params这步传入。这 个方法是在后台的线程中执行。并且在这里就可以返回相应的结果(还没有返回到主线程哦,结果返回将在第四步)在这个方法里面尅执publishProgress(Progress...),用于发布当前的进度,注意它的参数,同上面所说,泛型的第二个参数。它的结果会发布在主线程,也就是第三步。

3,onProgressUpdate(Progress...)在后台任务还在进行的时候展示热河类型的进度(进度条啊或者提示等),在UI主线程中运行当publishProgress(Progress...)

被调用的时候被调用。

4,onPostExecute(Result)在后台线程完成了之后被调用,注意参数,返回结果,在UI主线程中执行。

三,注意的地方:

1,必须在UI线程中创建AsyncTask实例

2,必须在UI中调用实例的execute(Params... params)方法,从这里开始执行耗时任务。注意它的参数

3,上面四个步骤里面的四个方法不应该代码调用,系统会回调。

4,不要多次调用AsyncTask任务,只可以调用一次,不然会产生异常。

里面其他的方法就懒得写了,因为比较简单,去看API就好

 




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值