Android AsyncTask的源码探秘

     AsyncTask,顾名思义,表示异步任务。

     它是一个处理异步任务的类,通过它,可以实现UI线程和后台线程进行通讯,后台线程执行异步任务,并把结果返回给UI线程。

透过最真实的源码,我们来看看它有哪些优点和缺点。( 括号 代表图片中的箭头注释)

     一、首选我们来再看看它的构造方法:

      

     (1)处 mWorker很简单,就是实现了Callable的匿名类,保存了外部传入的参数Params,它其实是最终执行的任务。

最后传给(2)处 mFutrue做参数。

     而mFutrue就是中间一层代码,它负责外面的异常处理。

     mWorker 的call方法中,调用了我们熟悉的AsyncTask的必需实现方法 doInBackground,而且最后它调用了postResult方法。postResult 就是返回进度与结果方法,没错,就是onProgressUpdate与onPostExecute,这样一看,是不是觉得很简单。

二、postResult的具体实现

     

     

       

     从上面可以看出,(1)(2)处的onProgressUpdate与onPostExecute的方法,其实还是借助 Handler 来完成,这个Handler是一个内部类,而且是单例模式,并且它是在UI主线程中,(3)处表示是该Handler 是在主线程中创建,所以也保证了onProgressUpdate与onPostExecute方法 也是在 UI线程中执行。

三、执行方式

    AsyncTask有2种执行方式:串行与并行。默认的执行方式是串行,当然现在它也能并行执行,看下 execute 方法,如下图:

     

     

     

     这个SerialExecutor 也是一个内部类,它里面包含一个ArrayDeque(任务队列),它每次都会从队首取出一个任务,执行完才会执行下一个任务,只到队列为空为止。它实际的执行类其实是一个ThreadPoolExecutor。

     所以如果想要以并行方式执行,就可以用 executeOnExecutor 方法,我们自己new一个ThreadPoolExecutor当参数,可以先定同时运行多少个任务等属性。

 四、总结:

    看完这些主要的源码,我们知道了它内部运行的原理,所以用它的时候就要注意以下几点了:

    1、我们定义AsyncTask的时候,要么定义为 静态匿名内部类,要么在Activity销毁的时候及时关闭AsyncTask。

      由于内部类的特点,AsyncTask内部类会持有外部类的隐式引用。由于AsyncTask的生命周期可能比Activity的长,当Activity进行销毁AsyncTask还在执行时,由于AsyncTask持有Activity的引用,导致Activity对象无法回收,进而产生内存泄露。

    2、AsyncTask的cancel方法,有时候不一定起作用,因为在doInBackground中,并没有对 cancel 标志作判断,需要用户自己加上,并严格控制。

   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值