- 博客(111)
- 资源 (7)
- 问答 (3)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 2020年度总结
前言不知不觉又到了写年度总结的时候,细翻了下,去年我居然没去写年度总结,想了想,可能当时也的确没什么总结的,可能就算有也不知道咋写吧。当然了这都是借口,不过现在就总结下2020的内容吧。工作今年工作对比19年来说,相对来说轻松一点,19年除了相关业务开发。因为是新项目所以我还负责管理android小组,虽然总共没几个人。不过要对接PMO,PM,QA等等。在这情况下,还需要负责业务开发,往往忙的只有晚上才能开始写代码。而今年除了业务的开发,其他的到没啥,所以我更注重于自我的成长,以及在团队内部推动相关技
2021-01-28 10:59:47
278
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 2018年博客之星评选,需要您宝贵的一票!非常感谢!
我正在参加CSDN 2018年博客之星评选,希望大家能投我一票,我在NO.018。感谢大家宝贵的一票,投票地址:https://bss.csdn.net/m/topic/blog_star2018/index
2018-12-31 16:59:22
752
2
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 2019请对2018的我好一点
回顾细细回顾这一年,不知不觉,就要2019了,2018发生了太多太多事了。依旧记得去年给自己定了三个方向的目标。现在想来,只完成了一个半。感觉这一年都是忙忙碌碌的度过的,却又不知道都忙些了啥。那就写个总结吧。今年也是第三年写年终总结了。工作与技术在去年的年终总结中,我也有说,今年要换一份工作,的确是换了份工作,而且还是两份,很多人都没想到,其中也包括我自己。可以说今年是毕业以来,换工作最频繁...
2018-12-29 19:59:19
2359
3
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 回首2017,展望2018
前言回首2017,展望2018。心里有很多话想多,有些却没法用语言表达出来。这也是第二年开始写年终总结。记得去年的总结,没有好好的规划今年,导致今年都不知道干了什么。所以决定今天在此总结自己的一年的收获以及来年的规划。回首工作早期了解我的读者,都知道我前年因为工作的事在家休假了半年。今年正月十六来到魔都上海,开始了找工作的旅行。也许是机缘巧合,半个月之后,我的一篇博客通过郭霖公众号投放出来的时候,我
2018-01-02 08:58:25
1887
4
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 为什么我要坚持写博客?
题记2017转眼即逝,这周已经是2017的最后一周了,今天我聊聊为什么要写博客。我从接触Android到现在,差一个月的时间就满三年了,写博客也写了两年半的时间了。从15年四月到现在。从阅读量很低,然后慢慢高起来,我记得今年年初的时候,我CSDN的访问量是3w左右,今年快结束了,我今天又看了一下,咦,突破15w了。2年3w和大半年12w的数据,使我很吃惊的。下面我就谈谈为什么要写,如何写以及写博客的
2017-12-27 09:34:53
2421
1
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 我的微信公众号开通了
突发奇想,一个想法诞生了。于是乎,这个公众号就这么冲天而降了。10年接触c, 14年接触java,这都不是重点,15年年初接触Android。16年年初走向Android的不归路。我希望在本公众号分享一些我所学的心得。已经当初填的一些坑。当然,本公众号支持投稿。刚开始维护公众号或多或少有一些不懂的地方。忘大家理解。我就是马云飞,希望可以把自己技术、思想成长的过程分享与你,感谢你的鼓励与陪伴,谢谢!欢
2017-07-29 18:54:13
1904
5
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 2016,不忘初心;2017,方得始终!
前言本人文笔很差,重来都是想到哪写到哪。如果写的不是很好,见谅。至于这次总结。就打算从技术、工作以及生活来做个年终总结。生活篇群里每次有新人进群的时候都会问我工作多久。嗯,我工作才勉强一年。不要认为我是工作了很久,我才是一个刚进社会的小萌新。今年刚毕业。 在无锡呆了快一年了。熟悉了那里的生活。熟悉了小区外的烧烤。熟悉了那边的拉条。每周都会吃那么一顿。每日每夜。总的来说。不是很喜欢。感觉和在乡下差不
2017-01-26 22:12:08
2263
7
原创 OkHttp源码分析
本文基于OkHttp 4.9.0分析OkHttp是什么?众所周知,OkHttp是一个客户端用来发送HTTP消息并对服务器的响应做出处理的应用层框架。而且现在流行的Retrofit的底层同样也是基于Okhttp的。那么OkHttp有什么优点呢?我们来看下:无缝的支持GZIP减少数据流量缓存响应数据减少重复的网络请求请求失败自动重试主机的其他ip,自动重定向。如果 HTTP/2 不可用, 使用连接池复用减少请求延迟。…使用方式OkHttpClient client = new OkHt.
2021-04-10 18:01:35
337
原创 Android Jetpack导航组件——Navigation的使用
概述Navigation是采用一个Activity和多个Fragment形式设计的Ui架构模式,但是众所周知,Fragment的管理一直是个麻烦事,需要通过FragmentManager和FragmentTransaction来管理Fragment之间的切换。所以Google提供了一套Navigation用来管理Fragment相互间的跳转等逻辑。我们先看下Navigation的优势:处理 Fragment 事务。默认情况下,正确处理往返操作。为动画和转换提供标准化资源。实现和处理
2021-03-09 23:45:46
1087
原创 Android Jetpack架构组件——LiveData原理篇
前言前面我们讲到了LiveData是如何使用的,并在最后留了几个问题。比如它是如何通过生命周期去变化的?为什么DESTORY不会接受数据?postValue和setValue是如何更新数据的?Transformations的map和switchMap方法内部是如何操作的?别急,本篇文章会带你了解其原理。接下来上正文。LiveData是如何观察生命周期变化的?如何观察生命周期,我们需要通过他的observe方法去看,我们上源码: @MainThread public void obser
2021-03-01 23:40:14
390
原创 Android Jetpack架构组件——LiveData使用篇
概述一般来说,LiveData很少单独使用,它更多的和Android Jetpack的其他组件搭配使用,比如ViewModel和ViewBinding。所以前面我们介绍ViewModel的使用以及其实现原理。那么这篇文章就来介绍LiveData的使用。LiveData是什么?通过字面意思其实我们可以理解成生存(活着)的数据。我们看下官方是怎么介绍它的:LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 Activi
2021-02-27 12:32:29
387
1
原创 Android Jetpack架构组件——一文带你了解ViewModel的使用及原理
概述前面我们讲过了lifecycle的使用及原理。今天我们谈谈viewModel。原本使用和原理是准备分开写的,结果我看了下ViewModel的原理,很简单,所以决定把两者放在一起了。那么接下来,我们进入正题。ViewModel是什么?ViewModel旨在以注重生命周期的方式存储和管理界面相关的数据。我们知道当屏幕旋转时,Activity会销毁并且重建,而它让数据可在发生屏幕旋转等配置更改后继续留存。哎?那就有人要问了,为什么我们不通过onSaveInstanceState()对数据进行保存,然后
2021-02-23 21:00:31
487
2
原创 Android Jetpack架构组件——Lifecycle原理篇
概述前面我们讲到了lifecycle是如何使用的,但是我们单单知道如何使用它还是不够的,我们需要知道它到底是如何绑定生命周期的。那么本篇我们就讲一下lifecycle的原理篇。本篇基于Android 9.0源码进行分析,如有不同,注意sdk版本。Lifecycle是什么?官方文档是这么描述的,Lifecycle它是一个类,用来存储相关组件的生命周期状态,如Activity或者Fragment等。并且允许其他组件对这些状态进行观察。我们先简单看一下Lifecycle这个类的源码:public
2021-02-20 15:56:17
517
原创 Android Jetpack架构组件——Lifecycle使用篇
概述Lifecycle是一个持有组件生命周期状态的class,并且允许其他组件来观察生命周期的变化。并不局限于Activity或者Fragment。我们只知道生命周期是由操作系统或者进程中运行的代码进行管理。而且生命周期是Android工作原理的核心,所以应用必须遵循它们。否则会引起OOM或者Crash。为什么需要使用Lifecycle管理生命周期在此我们用官网提供的一个示例: internal class MyLocationListener( private val contex
2021-02-08 16:00:09
345
原创 Android Jetpack架构组件——什么是Jetpack?
前言提到Android架构,我们首先想到的是MVC,MVP,MVVM。他们主要是针对视图和模型的。随着Android的发展,从原来的框架很少,全是自己动手撸。到现在框架越来越多,选型也越来越多,导致开发出来越来越不规范。我们知道MVP和MVVM只是应用在架构上,而不是在框架选型上。而google在2018年推出jetpack就是为了解决以上的问题。Jetpack是什么?Jetpack它不是一个新的架构,而是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和
2021-02-07 21:40:15
856
原创 Gradle中Transform是什么?
概述Google从 Android Gradle 1.5.0 开始,提供了Transform API。通过Transform API,允许第三方以插件的形式,在Android应用程序打包成dex文件之前的编译过程中操作.class文件。我们只要实现一套Transform,去遍历所有.class文件的所有方法,然后进行修改,再对源文件进行替换,即可以达到插入代码的目的。Transform可以做什么首先,我们可以先执行一次build操作,命令行会输出如下内容:> Transform core-ru
2021-02-04 20:40:26
883
1
原创 如何自己动手撸一个Gradle插件
前言前面我们已经把gradle中groovy的一些语法,以及常用的project和task介绍了一遍,那么我们通过自己撸个插件。刚好把前面的内容巩固下。插件的作用首先我们需要了解下插件的作用,主要有如下几点:添加任务到项目中,可对项目进行测试、编译、打包;添加依赖到项目中,可用来配置项目构建过程中需要的依赖;可以向项目中现有的对象类型添加新的扩展属性、方法等,可方便项目的配置和构建优化,比如 Android 项目构建中的 android{} 就是AndroidGradle插件为Pro
2021-02-02 22:00:33
1535
原创 Gradle入门以及环境搭建
前言gradle目前主要是在项目构建的时候使用,如果我们需要了解gradle。首先需要熟悉grooy的语法,本节来搭建groovy的环境,为了后续学习准备。Groovy环境搭建groovy SDK下载官网下载,直接解压,然后目录选择groovy/libexec。brew安装的groovy目录选择/usr/local/opt/groovy/libexec。(另外,在idea中无法切到/user目录下,mac按Cmd + Shift + G来切换目录)环境变量配置使用sudo vim ~/.b
2021-01-29 00:17:42
188
1
原创 Gradle核心之Task
前言gradle命令最终是通过task去执行的,可见task在gradle中的重要性。Task的定义与配置task的定义有两种形式,一个是直接通过task函数去创建,另一个是通过task的create方法去创建,示例代码如下:task test1Task{ println("test1Task")}tasks.create(name:'test2Task'){ println("test2Task")}刚刚我们为task指定了一个name。我们可以看看除了name我们还可
2021-01-29 00:14:10
310
原创 Gradle核心之Project
前言project在gradle里起到里重要的作用,上节我们也说过可以通过./gradlew projects打印当前项目下所有的project,准确的说是有build.gradle的文件既是一个project。而有多少project取决于在setting.gradle文件中设置了多少个。一个project对应一个输出,而具体输出什么取决于build.gradle里面的内容。Project核心API每个工程下都有一个build.gradle文件。根目录的build.gradle可以管理子工程下面的bu
2021-01-29 00:13:06
543
原创 Gradle简介及生命周期
Gradle简介gradle主要是由三个部分组成。groovy 核心语法:包括 groovy 基本语法、闭包、数据结构、面向对象等等。前面我们已经介绍过了。Android DSL(build scrpit block):Android 插件在 Gradle 所特有的东西,我们可以在不同的 build scrpit block 中去做不同的事情。Gradle api:包括task,projects,setting等等。具体如下图:Gradle优势灵活性:相对于 Maven、Ant 等构建
2021-01-29 00:11:50
1028
原创 Gradle入门之Groovy语法
前言gradle是一个基于JVM的构建工具,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与Java代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy可以使用其他Java语言编写的库。目前已经应用在多数Android技术体系中,比如,jenkins,插件化,组件化,模块化等等。如果你不了解gradle,那么前面几个技术点很难深入理解。Groovy 的语法跟 kotlin 类似,如果我们有 kotlin 的经验的话那么学习 gro
2021-01-29 00:07:36
433
原创 Gradle入门之Groovy元编程
简介Groovy的元编程是指groovy运行时,可以理解成编写代码所执行的时期,也就是Runtime。在比如有解释执行的Js,编译执行的java,还有运行时期执行的代码java反射。Groovy运行时的处理逻辑如下图:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i4GhgXKL-1611849711349)(https://s3.ax1x.com/2021/01/14/sdrfyj.png)]元编程按照上图所示,我们可以自己写一个Demo,示例代码如下:clas
2021-01-29 00:06:01
325
原创 JVM系列之GC回收机制
为什么需要GC?如果不进行垃圾回收,内存耗空是迟早的。因为我们在不断的进行内存分配,而不进行垃圾回收。除非内存足够大,可以让我们随意分配内存。但事实并非如此。什么是垃圾?所谓垃圾就是指内存中已经没用的对象。那么我们如何找到这些没用的对象。JVM中使用一种叫做可行性分析的算法来决定对象是否要被回收。可行性分析这个算法的思想是通过一系列称为“GCRoot”的对象作为起始点,从这些节点向下搜索,搜索所走过的路径称为引用链,当一个对象到GCRoot没有任何引用链(即GCRoots到对象不可达)时,则证明此
2021-01-28 11:17:28
1107
2
原创 JVM系列之Class初始化过程
概述一个 class 文件被加载到内存中需要经过三大步:装载、链接、初始化。其中链接又可以细分为:验证、准备、解析三小步。如图所示:装载装载是指JVM找到class文件生成字节流,然后根据字节流创建java.lang.Class对象的过程。过程如下:ClassLoader通过一个类的包名+类型来查找.class文件。并生成二进制字节流。把class文件解析为JVM内部的数据结构,并存储在方法区。(这种解析类似json文件解析成运行时的bean类)在内存中创建一个java.lang
2021-01-28 11:04:57
936
1
原创 JVM系列之JMM内存模型
java内存划分JMM规定了内存主要划分为主内存和工作内存两种。此处的主内存和工作内存跟JVM内存划分(堆、栈、方法区)是在不同的层次上进行的,如果非要对应起来,主内存对应的是Java堆中的对象实例部分,工作内存对应的是栈中的部分区域,从更底层的来说,主内存对应的是硬件的物理内存,工作内存对应的是寄存器和高速缓存。具体如图所示:正常情况下,java中所有的数据都是放在主存中的,如图所示:随着 CPU 技术的发展,CPU的执行速度越来越快,但内存的技术并没有太大的变化,如果JAVA线程每次读取和写入
2021-01-28 10:52:27
286
原创 JVM系列之程序运行时,内存是如何分配的?
Jvm中的内存划分JVM 中的内存可以划分为若干个不同的数据区域,主要分为:程序计数器、虚拟机栈、本地方法栈、堆、方法区。程序计数器java本身是多线程的,当某一线程被CPU挂起后,需要记录程序执行的位置,这个时候就需要用到程序计数器。方便CPU重新执行此线程时,知道从哪行指令开始执行。这就是程序计数器的作用。注意:1、在JVM中,对于程序计数器没有规定任何OutOfMemoryError的情况。2、线程私有的,每条线程内部都有一个私有程序计数器。它的生命周期随着线程的创建而创建,随着线程的结束
2021-01-28 10:37:11
254
原创 如何在工作中快速成长?致工程师的十条建议。
前言本文是我最近刚看完的一本《阿里工程师的自我修养》书中的部分内容,我做了简单的梳理。侵删。思考脑与反射脑简单介绍下什么是思考脑和反射脑。思考脑管理性,反射脑管直觉,存储脑管记忆,直觉依赖习惯,用直觉做出反应,快速,但未必正确;思考脑管理性,理性依赖逻辑,缓慢,但更加正确。有科学家通过研究,发现一个人一天的行为中,5%是非习惯性的,用思考脑的逻辑驱动,95%是习惯性的,用反射脑的直觉驱动...
2019-10-09 11:37:29
410
原创 设计模式之模块模式
概述在模板模式中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。使用场景多个子类有公共方法,并且逻辑基本相同时。重要的、复杂的方法,可以考虑作为模板方法。重构时,模板模式一般是最常用的,把相同的代码抽取到父类中,通过子类约束其行为。###例子我们将创建一个定义操作的 Game 抽象...
2018-12-17 10:18:59
627
1
原创 设计模式之外观模式
概述外观模式中开发过程中使用率非常高。它向现有的系统添加一个接口,来隐藏系统的复杂性。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。使用场景为复杂的模块或子系统提供外界访问的模块。子系统相对独立。预防低水平人员带来的风险。具体实现public interface Shape { void draw();}public clas...
2018-12-17 10:18:33
295
原创 设计模式之装饰模式
概述装饰模式也称包装模式,其使用一种对客户端透明的方式来动态扩展对象,同时它也是继承关系的一种替代方式之一。举个例子:孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。使用场景扩展一个类的功能。动态增加功能,动态撤销。具体实现//Component 英雄接口 public interface Hero { //学习技能 void...
2018-12-17 10:18:04
434
原创 设计模式之桥接模式
概述桥接模式是把抽象化和实现化进行解耦,使二者可以独立变化。这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响。使用场景如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系。对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧...
2018-12-17 10:16:18
322
原创 设计模式之享元模式
概述享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。使用场景系统中存在大量的相似对象。需要缓冲池的场景。具体实现public interface Ticket { public void showTicketInfo(String bunk);}// 火车票cla...
2018-12-14 15:59:00
250
原创 设计模式之适配器模式
概述适配器模式中开发中可以说是使用率最高的设计模式了。在listview、recyclerview中都需要使用适配器模式,并且在开发中遇到最多的问题也往往是在adapter中。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。使用场景系统需要...
2018-12-14 15:58:31
186
原创 设计模式之组合模式
概述组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。使用场景部分、整体场景,如树形菜单,文件、文件夹的管理。具体实现 public class Employee { pri...
2018-12-14 15:57:59
174
原创 设计模式之代理模式
概述代理模式也称为委托模式,这种模式在开发和生活中都很常见,比如猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。 还有让同学,同事带饭也是一种代理。总而言之,代理模式几乎可以说是无处不在了。那么我们看看代理模式有多普遍。使用场景当无法或不想直接访问某个对象或者访...
2018-12-14 15:57:34
265
原创 设计模式之访问者模式
概述访问者模式是一种将数据结构和数据操作分离的设计模式,它是设计模式中最复杂的一个,一般来说,它的使用概率并不高,但当你真当使用它时,你就真的需要它了。元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。使用场景对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。需要对一...
2018-12-14 15:57:05
166
原创 设计模式之中介者模式
概述中介者模式是用来降低多个对象和类之间通信的复杂性。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立变化。使用场景系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。具体实现我们通过聊天室实例来演示中介者模式。实例中,多个用户可以向聊天室...
2018-12-14 15:56:35
257
原创 设计模式之迭代器模式
概述迭代器模式又称游标模式,是行为性模式之一。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。使用场景访问一个聚合对象的内容而无须暴露它的内部表示。需要为聚合对象提供多种遍历方式。为遍历不同的聚合结构提供一个统一的接口。具体实现我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。实现了 Container 接口的实体...
2018-12-14 15:55:54
236
原创 设计模式之备忘录模式
概述备忘录模式是一种行为模式,该模式用于保存当前对象,并且在之后可以再次恢复到此状态。这有点像我们平时说的“后悔药”。备忘录模式实现的方式需要保证被保存的对象不能被对象从外部访问,目的是为了保护好被保存的这些对象的状态的完整性以及内部实现不像外暴露。使用场景需要保存/恢复数据的相关状态场景。提供一个可回滚的操作。具体实现备忘录模式使用三个类 Memento、Originator 和...
2018-12-14 15:55:25
280
Progress实现
2016-03-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人