- 博客(85)
- 资源 (1)
- 收藏
- 关注
原创 编写可读代码的艺术
读完这本书主要是回答几个问题什么是好的代码?好的代码就是可读性好,可读性好就是代码应当使别人理解它所需要的时间最少。什么样的命名是好的命名呢?要把信息塞进名字中,读者通过名字就可以获得很多的信息。使用专业的单词,不用get 用download fetch 等更好。不要用空泛的词,比如tmp。用具体的名字来更细致描述事物。给变量名带上重要的细节。为作用域大的名字用更长的名字。有目的地使用大小写和下划线等。不会误解的名字是最好的名字,阅读的人应该能准确的理解你的意思,命名前多想一下 其
2021-06-13 01:40:19
194
原创 热修复相关技术
什么是热修复热修复就是一家发布的app存在bug需要修复,但是不想重新发布安装包,通过让用户下载补丁文件的方式解决。市面上常见的热修复热修复主要两种思路像AndFix这种热修复一般是 native 动态替换java层代码,就是将句柄 指向了新的修复好的方法特点即时生效、注解、NDKRobust 对每个函数都在编译打包阶段自动的插入了一段代码。类似于代理,将方法执行的代码重定向到其他方法中特点即时生效、注解、插桩、代理Tinker通过计算对比指定的Base Apk中的dex与修改后的A
2021-05-07 14:41:21
299
原创 适配器模式
定义适配器模式把一个类的接口变换成客户端所期待的另外一种接口,从而使原本不匹配的接口能在一起工作使用场景(1)系统需要使用一个现有的类,而此类的接口不符合系统的需要,就是接口不兼容(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作(3)需要一个统一的输出接口,而输出端类型不可预知UML图我们可以看到Target 目标角色 也就是所期待得到的接口Adaptee 现在需要适配的接口Adapter 适配器角色 也是核心类把源接口转成目
2021-04-02 13:17:03
165
原创 代理模式
意图为其他对象提供一种代理以控制对这个对象的访问。在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,或者想在访问一个类时做一些控制,返回前后做一些事情都是可以,我们可以在访问此对象时加上一个对此对象的访问层,举个例子有个人想打官司 ,他可以自己打官司也可以请律师帮忙打官司,律师就是他们的代理人定义一个接口来定行为public in
2021-03-19 16:42:34
153
原创 模板方法模式
定义定义一个操作中的算法框架,而将一些步骤延迟到子类中吗,让子类可以不改变算法的结构的既可以重定义该算法的特定步骤使用场景1.一个子类有共有的方法,并且逻辑基本相同2.重要,复杂的算法可以把核心算法设计为一个模板方法,周边的相关细节功能由各个子类去实现3.重构的时候,模板方法模式是一个经常使用的模式,吧相同的代码抽取到父类中,然后通过钩子函数约束行为UML图AbsTemplate定义了一个算法框架ConcreteImplA 具体实现类AConcreteImplB 具体实现类B代码实现
2021-02-21 17:12:16
111
原创 备忘录模式
定义在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后可以将对象恢复到原先保存的状态。使用场景需要保存一个对象在某个时刻的某种状态或部分状态。如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节,并破坏对象的封装性,一个对象不希望外界直接访问内部状态,通过中间对象可以间接访问其内部状态。UML图如下Originator负责创建一个备忘录,可以记录,恢复自身内部状态,同时可以根据需要决定存储自身的哪些内部状态Memoto 备忘录角色,用于存储Origi
2021-02-18 22:46:06
113
原创 观察者模式
定义定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,所有依赖与他的状态都会被通知到。使用场景关联行为场景,需要注意的是关联行为是可以拆分的事件多级触发,跨系统的消息交换场景观察者模式的UML类图Subject 抽象的主题,也就是被观察者的角色,抽象主题角色把所有观察者对象的引用存在一个集合中,每个主题都可以有任意数量的观察者,抽象主题提供接口,可以增加删除观察者对象。ConcreteSubject 具体,该角色将有关状态存在具体观察者对象,具体内部发生变化的时候,给所有注册过的通知
2021-02-14 22:37:17
111
原创 责任链模式
一、定义使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系二、 责任链模式的使用场景多个对象可以请求同一请求,但具体由哪个对象处理则在运行时候动态决定在请求处理者不明确的情况下向多个对象中的一个提交一个请求需要动态指定一组对象处理请求责任链的UML三、代码实现定一个抽象的处理类 关键在与持有一个内部的自己引用public abstract class Handler { public Handler soccessor; public abs
2021-02-06 20:52:12
115
原创 策略模式
一、背景策略模式是一个比较实用的设计模式,在开发的时候经常遇到一种情况就是实现一个功能有多种方式,,我们可以根据不同的情况去选择不同的策略完成这个功能,当前你可以写在一个类中,加入大量的if else去判断,但是这就属于硬编码了,每次改动都会修改,不符合开闭原则,因此我们需要使用策略模式去根据不同的场景有不同的实现方案二、使用场景1.针对一类问题,有多种处理方式,但是仅仅具体行为有差异的时候2.出现一类抽象类有多个子类,需要if else来选择某个子类的时候三、结构图四、代码实现packa
2021-01-28 14:28:05
191
原创 工厂设计模式
1.定义工厂模式一个用于创建对象的接口,让子类来决定需要生产什么,可以隐藏生产的细节2架构图3.代码实现代码实现方式可以很多,但是我比较喜欢的是客户端可以动态生成的方式,也更加动态工厂的核心类,根据传入的类型生产确定的产品public abstract class Factory { public abstract <T extends Prodouct> T createFactory(Class<T> clz);}public class Rea
2021-01-20 23:53:07
120
原创 LeakCanary 详解
1.背景LeakCanary 是一种方便的内存泄露检查工具,与相对于用dump 内存 然后用MAT工具去分析,要简单便捷很多,我们需要了解如何使用这个工具及其背后的原理2.基本使用2.1加入远程引用 debugCompile 'com.squareup.leakcanary:leakcanary-android:1.6.1' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.1'2.2Le
2021-01-19 19:57:07
8331
1
原创 Builder模式
1 定义将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;2 举个例子我们通过一个例子来引出Builder模式。假设有一个Person类,我们通过该Person类来构建一大批人,这个Person类里有很多属性,最常见的比如name,age,weight,height等等,并且我们允许这些值不被设置,也就是允许为null,该类的定义如下。public class Person { private String name; private int age;
2021-01-18 13:31:15
175
原创 单例模式详解
1.前言单例模式应该是用得最多的设计模式之一,如果你的应用有个类很消耗资源 那么我们没有理由让他们不断创建2. 定义确保一个类只有一个实例,而且自行实例化,并向系统提供这个实例。3.适合场景确保一个类只有一个对象的地方,避免产生多个对象消耗过多的资源,或者说创建一个对象需要耗费大量的资源 也需要用单例模式。4.实现的关键点4.1构造方法不对外开发 一般是private4.2通过一个静态方法或者枚举返回单例对象4.3确保单例对象有且只有一个,尤其在多线程的环境下5.多种单例的写法和优缺点
2021-01-04 22:07:52
235
2
原创 六大设计原则
1. 单一责任原则一个类应该是一组相关性很强的函数,数据的封装,不同的职责应该分成不同的类,这样才能更好的扩展。2.开闭原则对扩展是开房的,但是对修改是关闭的,就是说对修改源来代码是不可以的,但是应该支持扩展,比如外边可以通过继承一个共同的接口设置进来,修改内部的实现3. 里氏替换原则所有引用基类的地方都可以透明地使用子类的对象4.依赖倒置模块之间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系通过接口或抽象类产生...
2020-12-08 00:17:23
112
原创 内存泄露与内存抖动排查策略
1.背景在开发App的过程中我们会经常遇到内存抖动或者内存泄露的问题,我们需要用一些常用的工具去定位这些问题2.内存抖动2.1定义短时间内有大量对象创建销毁,它伴随着频繁的GC2.2检测方式 :Profiler例子点击后创建大量字符串对象我们打开AndroidStudio在有问题的地方划上一个区域,下边会弹出一个对应的对象,你评估哪些对象个数是不合理的,像上面的例子就是String 是不合理的,一段时间内出现了2000多个,点击字符串会出现右上角的对象,再点击右上角会出现代码在哪一行创
2020-11-18 23:57:21
500
原创 Android开发常用的数据容器
一 、HashMap1.1 HashMap与HashTable的区别?主要区别有三点:线程安全性,同步,以及速度。HashTable是线程安全的,而HashMap不是;HashMap中允许存在null键和null值,而HashTable中不允许单线程环境下HashMap的速度快。多线程环境下,java 5提供了ConcurrentHashmap,它是HashTable的替代,比HashTable的扩展性更好。1.2 HashMap的工作原理是什么?or HashMap的get()方法工作原理?
2020-11-04 13:33:38
455
原创 APK打包过程
apk打包过程aapt阶段使用aapt来打包res资源文件,生成R.java、resources.arsc和res文件(二进制 & 非二进制如res/raw和pic保持原样)resources.arsc文件resources.arsc这个文件记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息。我们可以将这个resources.arsc文件想象成是一个资源索引表,这个资源索引表在给定资源ID和设备配置信息的情况下,能够在应用程序的资源目录中快速地找到
2020-10-21 09:00:15
285
原创 Activity启动逻辑及Hook技术的应用
背景为什么我们要学习Activity的启动逻辑及hook技术?随着插件化的流行,我们需要学会在没有注册 AndroidManifest的时候开启一个目标应用,这个就需要用到hook技术,而要理解hook技术,就必须掌握Activity的在fragmework的启动流程,同时在关键的地方准确的hook住才能实现一、Activity的启动过程(Android 8.0为例子) startActivity(new Intent(this, PageActivity.class));我们以最
2020-10-14 23:17:27
437
原创 AIDL原理全解析
背景目前Android的跨进程通讯主要就是采用Binder机制进行IPC通讯的,在实际的开发中,在跨进程的访问中我们也优先选用AIDL进行通讯,因为它相比传统IPC基于C/S 架构易用性高,只需要拷贝一次,所以我们有必要对AIDL进行详细的了解。1、简单使用 举个栗子比如我们要通过跨进程实现一个录屏功能,我们不需要知道另外一个服务是怎么实现录屏的功能的,我们只需要定义三个接口,就可以实现调用另外一个服务的方法,也就是跟另外一个服务通讯,命令它去开始录屏或者停止录屏,录屏完保存在一个路径中,这样客户端只
2020-10-04 13:02:44
1961
原创 Java虚拟机之垃圾回收
垃圾回收背景1、GC对应用的性能是有影响的;2、写代码有好处栈:栈中的生命周期是跟随线程,所以一般不需要关注堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点可达性分析来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。作为G
2020-09-23 13:15:19
154
原创 虚拟机之内存区域
程序计数器它只需要较小的内存空间,用来指明当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响你可以念 堆栈 堆栈 堆就是整个应用的 栈就是各个线程的虚拟机栈每个线程私有的,线程在运行时,在执行每个方法的时候都会打包成一个栈帧,存储了局部变量表,操作数栈,动态链接,方法出口等信息,然后放入栈。每个时刻正在执行的当前方法就是虚拟机栈顶的栈桢。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程。栈的大小缺省为1M,可用参数 –Xss调整大小,例如-Xss256k局部变量表:顾名思义就是
2020-09-20 13:35:12
86
原创 反射与动态代理模式
1.反射反射之中包含了一个「反」字,所以了解反射我们先从「正」开始。一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射 API 进行反射调用。反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。Reflection(反射)是Java被视为动态语言的关键,反射机制
2020-09-12 21:49:02
257
原创 泛型
背景为什么我们需要泛型场景1实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求和,需要重新在重载一个输入是double类型的add方法。场景2定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似于//1
2020-09-11 23:48:08
170
原创 UML入门初识
背景当有新人接手你的项目时候,你是否有足够的项目结构介绍资料给到新人? 当你作为一个新人接手别人的项目的时候,看项目的结构图的时候是否会一脸懵逼,因为你没有系统的学习UML相关的知识。了解UML图的绘制一方面可以检查自己的代码设计,并能向他人进行讲解。1.类图依赖关系 关联关系 泛化继承关系 实现 聚合 组合泛化对应 Java 中的 extends,画法:实线三角形箭头 实现对应 Java 中的 implements,画法:虚线
2020-07-05 13:10:42
301
原创 算法概念
算法概念算法是对特定问题的一个或者多个操作 算法有5个重要的特征(1)有穷性 :算法必须总在执行有穷步之后结束,每一步都可在有穷时间内结束(2)确定性: 算法中每个指令必须有确切的含义 没有二意(3) 可行性: 一个算法是可行的(4) 输入:一个算法有零个或者多个输入(5)输出:有一个或者多个输出-------------------------------------------------------------------------->常用典型算法思想迭代法: 迭代法是用于求
2020-07-04 23:21:49
217
原创 Rxjava && RxAndroid的基础使用
1.背景Rxjava是微软公司为了解决实际遇到的流问题而发明出来的,它又很多优点比如jar包非常小 只有大概一m是一个轻量级的框架支持java 8 lamba表达式从Android2.3开始支持支持同步和异步RxAndroid是Rxjava 提供给Android的一个扩展库,它主要是提供了一个调度器Schedulers,可以解决子线程和主线程切换的问题。2.观察者模式需要知道...
2020-04-12 20:53:27
896
1
原创 AIDL跨进程通讯
背景AIDL跨进程通信,又叫做Android 接口定义语言,能让两个Android进程进行通讯的语言一、服务端创建一个aidl文件package com.example.server;interface IPlayServiceAIDL { void play(); void stop();}包名必须是服务端的包名,文件夹的目录如图所示,写好aidl文件后m...
2020-02-09 22:24:41
222
原创 Android 系统结构
Android系统架构Android系统结构分为5层,从上到下依次是应用层,应用架构层,系统运行层,硬件抽象层和Linux内核1.应用层系统的内置应用程序以及非系统的应用程序都属于应用层,负责与用户的交互 通常由java开发2.应用架构层应用架构层为开发人员提供开发应用需要的api,我们平时开发的应用程序都是调用这一层的API 也叫FrameWork3.系统运行库系统运行库分为两部分...
2020-01-25 21:53:07
231
原创 LeakCanray源码分析
一、背景LeakCanray 是由square开源的一款轻量的第三方开源内存检测工具,让我们可以方便复查排查问题的所在。二、Java内存分析2.1 栈内存:存放我们的基本类型2.2 堆内存:存放我们new 出来的对象由java虚拟机来管理2.3 方法区:存放方法和静态变量2.4 内存泄露的原因,一个长生命周期对象持有另外一个对象的引用导致对象的无法回收所以泄露,会导致OOM的主要原因之...
2019-10-05 13:23:56
278
原创 BlockCanary源码解析
1.背景随着代码复杂度越来越大,我们越来越难定位到UI卡顿的问题,所以需要用到BlockCanary来定位卡顿的原因2.常见UI卡顿原因2.1 出现耗时操作2.2 布局过于复杂2.3 过度绘制2.4 过度measure 和 layout2.5 内存频繁触发gc3.使用步骤3.1 添加依赖 implementation 'com.github.markzhai:block...
2019-09-22 23:24:51
547
原创 Dagger2源码解析
1、背景Dagger2是一个依赖注入框架能让项目进行解耦合,现在Dagger2在项目中被广泛使用特别是结合MVP架构使用,非常典型的降低耦合,因为在MVP模式只能中Activity持有presenter的引用,同时presenter又持有view的引用,这样便于更新UI界面,这样Activity和Presenter就耦合在一起了,而dagger注入可以有效解耦合2、基础使用1.添加依赖 ...
2019-03-16 14:09:23
474
原创 MVC、MVP、MVVM彻底理解
背景随着Android的成熟Android的应用架构越来越多受到重视,因为程序的维护和扩展远远比开发成本要高很多,选用良好的的设计架构能很好地维护和扩展程序1.MVC 模式(1)Model 我们针对业务模型,建立数据结构和相关的类(2)View 一般可以表达为xml文件的布局(3)Controller 在Activity的逻辑处理可以认为是控制层优缺点MVC 模式的一个优点就是使用简...
2019-03-12 22:31:50
207
原创 行为型设计模式
1.策略模式1.1定义 :定义一系列算法,把每个算法封装起来,使得他们可以互相替代1.2代码实现定义一个共同接口public interface FightingStrategy { public void fighting();}对不同的场景实现接口实现不同的方法public class CommonRivalStrategy implements FightingS...
2019-02-24 15:07:52
165
原创 结构型设计模式
1.代理模式定义:为其他对象提供一种代理以控制对这个对象的访问1.1简单实现静态代理定义个购买的接口public interface IShop { void buy();}我这个人 需要购买public class LiuWangShu implements IShop { @Override public void buy() { Sy...
2019-02-23 14:44:43
135
原创 创建型设计模式
1单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点1.1单例模式的写法1.1.1饿汉模式public class Singleton { private static Singleton instance = new Singleton(); private Singleton() { } public static Singleton g...
2019-02-21 21:44:13
964
原创 六大设计原则
1.单一责任原则定义:对一个类而言,应该只有一个引起它改变的原因通俗地讲就是不要让一个类承担太多的职责,比如 一个Activity不要放bean类,不要把适配器也放进来,Activity就是一个展示的页面和功能。2.开放封闭原则定义:类,模块,函数等应该是可以扩展的,但是不可修改就是我们再设计时候应该尽量通过扩展的方式来实现,而不是改变代码逻辑,比如静态工厂和动态工厂,动态工厂就是开放封...
2019-02-21 13:25:47
106
原创 EventBus源码解析
1.背景EventBus作为一款事件发布的第三方开源框架,几乎是每个项目都会使用到,使用它可以对Fragment和Fragment之间 Activity和Activity之间,不同组件之间信息交互变得便捷,减少耦合性上有非常显著的效果,为了搞清楚EventBus 这个Android开发中国民级的开源组件源码,我们来看一下源码是怎么写的2.基础使用加入引用 implementation...
2019-02-20 00:13:18
186
原创 Retrofit 源码解析
1.背景Retrofit 是一个基于okHttp为基础的网络请求框架,底层用到了okHttp来进行网络请求,并且结合RXJava能做到非常强大的切换控制作用是现在主流的Android开发框架,并且Retrofit在设计之中用到了大量的设计模式,其实非常适合我们去学习。2.基础使用我们可以看到它的基本使用 其实就是用建造者模式建造了一个Retrofit对象 然后创建了一个call对象 ,调用c...
2019-02-11 00:07:14
278
原创 OkHttp源码分析
1.背景okHttp作为Android开发最火的开源网络请求框架在Android网络请求中有重要位置2.OkHttp的基本使用File externalCacheDir = context.getExternalCacheDir(); int cacheSize = 10 * 1024 * 1024; OkHttpClient.Builder builder ...
2019-02-09 18:59:58
201
原创 Android网络请求相关
1.网络基本知识1.1 网络分层1.1.1物理层负责比特流在节点之间的传输1.1.2 数据链路层 吧不可靠的物理线路上进行数据的可靠传递1.1.3 网络层决定如何将数据从发送方到接收方1.1.4 传输层进行端到端的通信 这上面有Tcp和Udp协议1.1.5应用层 主要协议是HTTP 和FTP 等协议1.2 三次握手与四次挥手1.2.1 三次握手第一次握手:建立连接 客户发送请求报...
2019-02-06 21:19:16
423
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人