设计模式---模板设计模式之AsyncTask源码解读

(图文无关,方便各位老铁看时视觉缓冲)

在所有开始之前,先和大家介绍一下23种设计模式中的模板设计模式

首先,什么是设计模式?我们为什么要使用设计模式,这里给设计模式正个名,

网上有些哥们对设计模式还是有点偏见的----可以自己敲干嘛用什么设计模式?画蛇添足,思维固化吗?

我的看法是:这是每个人的编码习惯而造成的偏见,所以,你是没办法说设计模式对每个人

都是合适的,看个人!你可以因为设计模式的好而去使用它


设计模式---模板设计模式之AsyncTask源码解读_第1张图片

接下来我就说说设计模式好在哪里,毕竟这些设计模式是经过老一代程序员前辈的手而流传下来的,

里面总有一些东西值得我们去学习和借鉴。当然你也可以自己去设计一些模式,这并不影响。

好,不多说。下面我们来看看什么是设计模式,他们好在哪里。

设计模式的概念:

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。

以上是百度百科出来的答案。我们看这个的时候抓住他们的关键词,就是上面我用字体加粗部分,可重用性:这个避免了代码的冗余

减少了内存的消耗(当然其实这个病不会消耗我们多少内存,但是如果每次我都要重新去写一份一样的程序的话,我第一反应就是怎么只用一次

才不至于写些冗余的程序,这个非常符合我们写程序时追求的简单,高效原则),容易被他人理解:设计模式是相当有条有理的,相比于一些代

码这里一堆哪里一坨的,你觉得那个更好理解一点?可靠性:容易产生的bug不多,当然这是在你按照他的模式去写。工程化:这里我个人觉得是

强调的是这个程序系统的有序,思维清晰,逻辑严谨。当然也是相对一些比较杂的程序而言的,当一个团队去做一个项目是,你想,如果这里做

一点哪里做一点,或者说一个类,这个人要加点权限,那个人又要加点权限。不就呵呵了吗?(如果你用代理模式来代理过been类就有些体会了)



设计模式---模板设计模式之AsyncTask源码解读_第2张图片
()

                                               (壁纸:上帝之眼的星空现象,双屏显示贼6,)

好,到这里我就不说设计模式有多好了,直接去讲我们今天的主题---模板设计模式解读AsyncTask这个类。



设计模式---模板设计模式之AsyncTask源码解读_第3张图片

AsyncTask task = new AsyncTask(){

            @Override

            protected void onPostExecute(Void aVoid) {

                super.onPostExecute(aVoid);

                // 执行完成返回的方法 , UI 主线程

            }

            @Override

            protected Void doInBackground(Void... params) {

                // 执行一些耗时的操作  连接网络获取数据,读取大型数据库  运行在Thread中

                return null;

            }

            @Override

            protected void onPreExecute() {

                // 一调用就会执行的方法 UI 主线程

                super.onPreExecute();

            }

        };

        // RXJava  模板的设计模式  非常符合

        task.execute();


我详细学过安卓的对这个类不会很陌生,异步加载类(常用类)

我们点击进去这个类,可以看到这个类是“长“这个样子的,关键看什么呢?


设计模式---模板设计模式之AsyncTask源码解读_第4张图片

先把目光放在这个方法上面,从这上面可以理解为什么这个类他是只执行一次了吧!!不理解的可以多看几次。

这里我们可以看出AsyncTask 一开始就会调用 onPreExecute这个方法

然后执行FutureTask(Runnable)执行run方法 然后最终会调用 执行在线程中


设计模式---模板设计模式之AsyncTask源码解读_第5张图片

观察一下,doInBackground(mParams);是运行在线程中的

然后继续看另外一个方法,就是如何把已经开启了的线程切换到主线程中(这里我想很多人都已经有点感觉到了:

headler消息发送机制),没错--->



设计模式---模板设计模式之AsyncTask源码解读_第6张图片



设计模式---模板设计模式之AsyncTask源码解读_第7张图片

postResult 在线程中通过Handler的消息机制发一个消息让其切换到主线程中,然后执行onPostExecute()方法。(如果还不明白为什么只执行一次的,看到这里估计也明白了,mStatus值得变化结合上的)

finish会去判断有没有取消,如果是取消了就会调用onCancelled()方法,否则就是onPostExecute() 执行在主线程中了,最后把状态置为FINISHED。

到这里大概所有的过程都已经说的差不多了,如果想更好的了解,我的建议是:你最好实践一波。起码把我说的这些东西找到。


总结:ececute()方法一调用就会去判断状态,如果状态不对就会抛异常,然后会把状态置为Running ,然后执行onPreExecute(), 开一个线程执行 doInBackground(),

        doInBackground()执行完毕之后会利用Handler发送消息切换主线程中,然后执行onPostExecute()方法,最后把状态置为FINISHED。


我在源码阅读这方面也算个新手,如果有那位眼光高的兄弟看到了,就请多指教了哈!



最后,现在我的时间是22:45,祝你晚安,陌生人!


设计模式---模板设计模式之AsyncTask源码解读_第8张图片

你可能感兴趣的:(设计模式---模板设计模式之AsyncTask源码解读)