美文网首页我的世界程序员我爱编程
设计模式---模板设计模式之AsyncTask源码解读

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

作者: 九尾74 | 来源:发表于2018-04-15 22:48 被阅读36次

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

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

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

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

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

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

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

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

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

    设计模式的概念:

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

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

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

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

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

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

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

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

    ()

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

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

    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 一开始就会调用 onPreExecute这个方法

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

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

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

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

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

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

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

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

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

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

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

    相关文章

      网友评论

        本文标题:设计模式---模板设计模式之AsyncTask源码解读

        本文链接:https://www.haomeiwen.com/subject/fsdshftx.html