Asynctask知识点

一、什么是Asynctask

        Asynctask是封装了线程池和handler的异步框架,Asynctask中尽量执行短时间的异步操作,长时间的异步操作最好还是使用线程池。

二、Asynctask的使用方法

        1、三个参数

            
            继承与Asynctask的后面的三个参数,第一个参数是在执行Asynctask所要传入的参数,这个参数可以在后台任务中使用,第二个参数表示在后台执行任务时当前进度的参数类型,第三个参数是在任务执行完毕后,如果要对结果进行返回,那个这个String就是返回类型。

        2、5个方法

            onPreExecute():在耗时操作执行之前执行的方法,可以进行初始化操作,在UI线程中调用的。
            doingBackground():执行耗时操作的方法,在onPreExecute方法执行后执行,最后的返回是去到了onPostExecute方法中。在此方法中可以调用publicProgress()方法来发布渐变的单位,就可以不断的更新显示计算进度。
            onProgressUpdate():在publicProgress()方法调用完成之后就会调用此方法,此方法主要是可以更新进度条。
            onPostExecute():最后调用此方法,在后台耗时计算完成之后调用,结果也会返回到此方法中。

三、Asynctask内部原理

        1、Asynctask的本质是一个线程池,Asynctask派生的子类可以实现不同的异步任务,这些任务都提交到静态的线程池中执行。

        2、线程池中的工作线程是在doingBackground方法中执行异步任务的。

        3、当任务状态改变后,工作线程会向ui线程发送消息,Asynctask内部的IntenalHandler(其实就是Handler机制)响应这些消息,并调用相关的回调函数。

四、Asynctask的注意事项

           1、内存泄漏:同样是由于非静态内部类持有外部类的匿名引用,导致外部类想要被内存回收时,由于非静态内部类还持有外部类的应用,导致外部类无法被回收。解决方法跟Handler是相类似的,就是把Asynctask设置为static同时在Asynctask的里面持有外部类的弱引用,这样可以使外部类能被顺利回收。或者在外部Activity的onDestory方法里面,执行Asynctask的cancel方法。

            2、生命周期:如果Asynctask执行完成之后没有调用cancel方法,有可能Asynctask在activity销毁之前导致崩溃,因为Asynctask想要处理的view依托的Activity已经不存在了。所以在onDestory方法中要调用Asynctask的cancel方法,来保证程序的稳定。

            3、结果丢失:在屏幕旋转或者Activity被后台回收,但是Asynctask仍然持有被杀了的Activity的引用,但是这个引用已经无效了。这时候在onPostExecute方法就不会生效。

            4、并行or串行:Asynctask是默认串行执行的,如果要并行的话可以执行Asynctask的executeOnExecute方法。一般建议使用串行。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值