(图文无关,方便各位老铁看时视觉缓冲)
在所有开始之前,先和大家介绍一下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,祝你晚安,陌生人!