设计模式---模板方法模式和AsyncTask的源码分析

定义:定义一个操作中的方法的框架,将这些方法的具体的实现延迟到子类中实现, 使得子类能够不改变算法的结构就能重新定义算法的内容。也就是流程封装。
使用场景:代码执行的流程是固定的,也就是我们常用的将各个方法抽取的到父类中,然后通过钩子函数进行约束子类中的行为。我们常用的BaseActivity,BaseFragment等都是使用这种设计模式。
优点:封装不变的部分,扩展可变的部分。提取公共的方法,方便进行维护。
缺点:可能影响代码的阅读。

AsyncTask的源码分析
1.使用
在这里插入图片描述
2.初始化构造器
这里传递的参数是null
在这里插入图片描述
因此mHandler被赋值为getMainHandler(), 并创建WorkerRunnable和FutureTask类。
在WorkerRunnable中的call()方法中调用doInBackground()方法。这个方法可以由用户自己实现。然后调用了postResult(result)方法,发送handler。
在这里插入图片描述
在这里,mFuture包裹mWorker的对象。
在这里插入图片描述
3. 内部handler类-----InternalHandler类,就是一个自定义的handler类
在这里插入图片描述
在这里进行获取我们使用AsyncTask的参数,并且只取了第一个参数。
在这里插入图片描述
4.调用AsyncTask的execute(params)方法.这里是方法进行执行的入口。
在这里插入图片描述
上面的sDefaultExecutor是SerialExecutor()的实例。这里的ArrayDeque就是自定义的16位的数组。在这里的mTasks.offer()方法就是向数组中添加一条数据。然后在run()方法中,调用r参数的run()方法。这里的r在下面的方法中能够看到。调用schedulerNext()方法,在mTasks.poll()取出存放的数据,然后调用THREAD_POOL_EXECUTOR.execute()方法。
这里的THREAD_POOL_EXECUTOR就是线程池的对象。
在这里插入图片描述
这里使用了线程池。要研究线程的源码
在这里插入图片描述
5.调用executeOnExcutor()方法。在这里mStatus默认就是PENDING,但是这个mStatus在代码的运行中是在改变的,因此asyncTask的实例调用excute()方法只能调用一次。因为如果重复调用这里的mStatus已经发生改变,会报异常。
在这里设置mStatus的状态。然后调用onPreExecute()方法。调用exec.execute(mFuture)方法,这里传进去的是mFuture对象。可以在前几张图中发现是调用scheduleNext()方法。然后调用线程池的execute()方法。
在这里插入图片描述
6.调用线程池的execute()方法。根据下面的英文的注释,很明显的知道在线程池中处理任务就会自动的开启线程。
在这里插入图片描述
在这里插入图片描述
其中最重要的就是调用addWorker()方法,在这里才是真正的创建线程。
在addWorker()中最重要的方法。
在这里插入图片描述
在Worker()的构造器中就看到了线程的创建。
在这里插入图片描述
7.在线程池中要调用的是mFuture的run()方法。这时候就会调用callable的call()方法。这里的callable就是传递过去的mWorker对象。然后在set(result)中会调用自己的done()方法。
在这里插入图片描述
8.创建WorkerRunnable类实现Callable接口,并且添加了mParams参数。
在这里插入图片描述
在这里插入图片描述
在WorkRunnable()的call()方法中,最终会调用postResult()方法。这里的getHandler()就获取了上面的InternalHandler的对象。然后进行发送handler消息,然后进行消息的处理。注意在这里传递的参数是AsyncTaskResult()的对象。
在这里插入图片描述
在AsyncTaskResult()的对象中,封装了两个参数,其中第一个就是当前的AsyncTask的对象,第二个其实就我们传递过来的可变参数。
在这里插入图片描述
5.处理handler消息,
最终调用的是当前的AsyncTask对象的finish()方法。在这里如果是取消,那么就会调用onCancelled()方法,否则就会调用onPostExecute()方法。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值