Android基础知识
文章平均质量分 58
魏华达
这个作者很懒,什么都没留下…
展开
-
编写可读代码的艺术
读完这本书主要是回答几个问题什么是好的代码?好的代码就是可读性好,可读性好就是代码应当使别人理解它所需要的时间最少。什么样的命名是好的命名呢?要把信息塞进名字中,读者通过名字就可以获得很多的信息。使用专业的单词,不用get 用download fetch 等更好。不要用空泛的词,比如tmp。用具体的名字来更细致描述事物。给变量名带上重要的细节。为作用域大的名字用更长的名字。有目的地使用大小写和下划线等。不会误解的名字是最好的名字,阅读的人应该能准确的理解你的意思,命名前多想一下 其原创 2021-06-13 01:40:19 · 217 阅读 · 0 评论 -
热修复相关技术
什么是热修复热修复就是一家发布的app存在bug需要修复,但是不想重新发布安装包,通过让用户下载补丁文件的方式解决。市面上常见的热修复热修复主要两种思路像AndFix这种热修复一般是 native 动态替换java层代码,就是将句柄 指向了新的修复好的方法特点即时生效、注解、NDKRobust 对每个函数都在编译打包阶段自动的插入了一段代码。类似于代理,将方法执行的代码重定向到其他方法中特点即时生效、注解、插桩、代理Tinker通过计算对比指定的Base Apk中的dex与修改后的A原创 2021-05-07 14:41:21 · 311 阅读 · 0 评论 -
适配器模式
定义适配器模式把一个类的接口变换成客户端所期待的另外一种接口,从而使原本不匹配的接口能在一起工作使用场景(1)系统需要使用一个现有的类,而此类的接口不符合系统的需要,就是接口不兼容(2)想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的类,包括一些可能在将来引进的类一起工作(3)需要一个统一的输出接口,而输出端类型不可预知UML图我们可以看到Target 目标角色 也就是所期待得到的接口Adaptee 现在需要适配的接口Adapter 适配器角色 也是核心类把源接口转成目原创 2021-04-02 13:17:03 · 179 阅读 · 0 评论 -
代理模式
意图为其他对象提供一种代理以控制对这个对象的访问。在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,或者想在访问一个类时做一些控制,返回前后做一些事情都是可以,我们可以在访问此对象时加上一个对此对象的访问层,举个例子有个人想打官司 ,他可以自己打官司也可以请律师帮忙打官司,律师就是他们的代理人定义一个接口来定行为public in原创 2021-03-19 16:42:34 · 168 阅读 · 0 评论 -
备忘录模式
定义在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样,以后可以将对象恢复到原先保存的状态。使用场景需要保存一个对象在某个时刻的某种状态或部分状态。如果用一个接口来让其他对象得到这些状态,将会暴露对象的实现细节,并破坏对象的封装性,一个对象不希望外界直接访问内部状态,通过中间对象可以间接访问其内部状态。UML图如下Originator负责创建一个备忘录,可以记录,恢复自身内部状态,同时可以根据需要决定存储自身的哪些内部状态Memoto 备忘录角色,用于存储Origi原创 2021-02-18 22:46:06 · 123 阅读 · 0 评论 -
观察者模式
定义定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,所有依赖与他的状态都会被通知到。使用场景关联行为场景,需要注意的是关联行为是可以拆分的事件多级触发,跨系统的消息交换场景观察者模式的UML类图Subject 抽象的主题,也就是被观察者的角色,抽象主题角色把所有观察者对象的引用存在一个集合中,每个主题都可以有任意数量的观察者,抽象主题提供接口,可以增加删除观察者对象。ConcreteSubject 具体,该角色将有关状态存在具体观察者对象,具体内部发生变化的时候,给所有注册过的通知原创 2021-02-14 22:37:17 · 120 阅读 · 0 评论 -
策略模式
一、背景策略模式是一个比较实用的设计模式,在开发的时候经常遇到一种情况就是实现一个功能有多种方式,,我们可以根据不同的情况去选择不同的策略完成这个功能,当前你可以写在一个类中,加入大量的if else去判断,但是这就属于硬编码了,每次改动都会修改,不符合开闭原则,因此我们需要使用策略模式去根据不同的场景有不同的实现方案二、使用场景1.针对一类问题,有多种处理方式,但是仅仅具体行为有差异的时候2.出现一类抽象类有多个子类,需要if else来选择某个子类的时候三、结构图四、代码实现packa原创 2021-01-28 14:28:05 · 206 阅读 · 0 评论 -
工厂设计模式
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 · 128 阅读 · 0 评论 -
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 · 8358 阅读 · 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 · 184 阅读 · 0 评论 -
六大设计原则
1. 单一责任原则一个类应该是一组相关性很强的函数,数据的封装,不同的职责应该分成不同的类,这样才能更好的扩展。2.开闭原则对扩展是开房的,但是对修改是关闭的,就是说对修改源来代码是不可以的,但是应该支持扩展,比如外边可以通过继承一个共同的接口设置进来,修改内部的实现3. 里氏替换原则所有引用基类的地方都可以透明地使用子类的对象4.依赖倒置模块之间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系通过接口或抽象类产生...原创 2020-12-08 00:17:23 · 123 阅读 · 0 评论 -
内存泄露与内存抖动排查策略
1.背景在开发App的过程中我们会经常遇到内存抖动或者内存泄露的问题,我们需要用一些常用的工具去定位这些问题2.内存抖动2.1定义短时间内有大量对象创建销毁,它伴随着频繁的GC2.2检测方式 :Profiler例子点击后创建大量字符串对象我们打开AndroidStudio在有问题的地方划上一个区域,下边会弹出一个对应的对象,你评估哪些对象个数是不合理的,像上面的例子就是String 是不合理的,一段时间内出现了2000多个,点击字符串会出现右上角的对象,再点击右上角会出现代码在哪一行创原创 2020-11-18 23:57:21 · 521 阅读 · 0 评论 -
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 · 478 阅读 · 0 评论 -
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 · 304 阅读 · 0 评论 -
Java虚拟机之垃圾回收
垃圾回收背景1、GC对应用的性能是有影响的;2、写代码有好处栈:栈中的生命周期是跟随线程,所以一般不需要关注堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点可达性分析来判定对象是否存活的。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain),当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。作为G原创 2020-09-23 13:15:19 · 164 阅读 · 0 评论 -
虚拟机之内存区域
程序计数器它只需要较小的内存空间,用来指明当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响你可以念 堆栈 堆栈 堆就是整个应用的 栈就是各个线程的虚拟机栈每个线程私有的,线程在运行时,在执行每个方法的时候都会打包成一个栈帧,存储了局部变量表,操作数栈,动态链接,方法出口等信息,然后放入栈。每个时刻正在执行的当前方法就是虚拟机栈顶的栈桢。方法的执行就对应着栈帧在虚拟机栈中入栈和出栈的过程。栈的大小缺省为1M,可用参数 –Xss调整大小,例如-Xss256k局部变量表:顾名思义就是原创 2020-09-20 13:35:12 · 96 阅读 · 0 评论 -
反射与动态代理模式
1.反射反射之中包含了一个「反」字,所以了解反射我们先从「正」开始。一般情况下,我们使用某个类时必定知道它是什么类,是用来做什么的。于是我们直接对这个类进行实例化,之后使用这个类对象进行操作。反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用 new 关键字来创建对象了。这时候,我们使用 JDK 提供的反射 API 进行反射调用。反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。Reflection(反射)是Java被视为动态语言的关键,反射机制原创 2020-09-12 21:49:02 · 270 阅读 · 0 评论 -
泛型
背景为什么我们需要泛型场景1实际开发中,经常有数值类型求和的需求,例如实现int类型的加法, 有时候还需要实现long类型的求和, 如果还需要double类型的求和,需要重新在重载一个输入是double类型的add方法。场景2定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。这是完全允许的,因为此时list默认的类型为Object类型。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似于//1原创 2020-09-11 23:48:08 · 177 阅读 · 0 评论 -
UML入门初识
背景当有新人接手你的项目时候,你是否有足够的项目结构介绍资料给到新人? 当你作为一个新人接手别人的项目的时候,看项目的结构图的时候是否会一脸懵逼,因为你没有系统的学习UML相关的知识。了解UML图的绘制一方面可以检查自己的代码设计,并能向他人进行讲解。1.类图依赖关系 关联关系 泛化继承关系 实现 聚合 组合泛化对应 Java 中的 extends,画法:实线三角形箭头 实现对应 Java 中的 implements,画法:虚线原创 2020-07-05 13:10:42 · 317 阅读 · 0 评论 -
算法概念
算法概念算法是对特定问题的一个或者多个操作 算法有5个重要的特征(1)有穷性 :算法必须总在执行有穷步之后结束,每一步都可在有穷时间内结束(2)确定性: 算法中每个指令必须有确切的含义 没有二意(3) 可行性: 一个算法是可行的(4) 输入:一个算法有零个或者多个输入(5)输出:有一个或者多个输出-------------------------------------------------------------------------->常用典型算法思想迭代法: 迭代法是用于求原创 2020-07-04 23:21:49 · 239 阅读 · 0 评论 -
史上最全Universal-Image-Loader源码解析————核心代码篇
背景接着上一篇的内容,我们接着看ImageLoader的核心代码篇,上一篇主要是看ImageLoader的内存优化,主要包括磁盘缓存和内存缓存,还有就是内存的缓存策略,这一篇,我们重点来看一下ImageLoader是如何使用这些内存和进行图片的展示和图片处理和下载的。一、code组织框架首先我们先看code包下面的组织框架,然后我们再每个类去分析,最后我们全部串起来学习。核原创 2018-01-30 16:17:36 · 381 阅读 · 0 评论 -
应用最广的模式——单例模式
背景、单例模式是应用最广的模式之一,也很可能是很多初级工程师唯一会使用的设计模式,在应用这个模式的时候,单例对象的类必须保证只有一个实例存在,许多时候整个系统只需要一个全局对象,这样有利我们协调系统的整体行为,如在一个应用中,应该只有一个ImageLoader实例,这样ImageLoader中既有线程池,缓存系统,网络请求等,很消耗资源,因此,没有理由让它有很多个实例。一、使用场景原创 2018-01-06 20:06:23 · 240 阅读 · 0 评论 -
面向对象六大原则
前言背景在应用开发过程中,最难的不是完成开发工作,而是在后续的升级和维护之中,让系统能拥抱变化,拥抱变化也就意味在满足需求且不破坏系统稳定性的前提下提高可扩展性,高内聚,低耦合,在经历了各个版本更新后依然能保持清晰,灵活,稳定的系统架构,遵循面向对象的六大原则就使我们走向灵活软件系统之路所迈出的第一步。一、单一职责原则单一责任注重单一二字,正如ImageLoader一样Imag原创 2018-01-06 14:53:51 · 162 阅读 · 0 评论 -
应用最广泛的模式——工厂方法模式
背景工厂方法是创建型设计模式之一,工厂方法模式是一种结构简单的模式,在我们的开发之中应用十分广泛,作为一个java程序员,我们实在有必要去深入理解一、工厂方法模式定义定义一个用于创建对象的接口,让子类决定实例化哪个类工厂化方法模式在任何需要生成复杂的对象适合使用工厂模式,用new就可以创建的对象无须使用工厂模式二、普通工厂方法模式public abstr原创 2018-01-22 22:31:31 · 299 阅读 · 0 评论 -
ANR产生的原因及其定位分析
前言ANR是Android 中独有的概念,全称Application No Responding 如何定位和和避免出现这个问题是Android程序员的必备修养一 、ANR产生的原因1.1 ANR 产生的原因只有当应用程序的UI线程响应超时才会引起ANR 超时产生的原因有两种,1 当前事件没有机会处理,例如UI线程正在响应另外的事件,当前事件被某个事件给阻塞掉了 2 当前事件正在处理 但是由于耗时太原创 2017-07-09 23:59:26 · 4864 阅读 · 0 评论