Android宇宙最强知识体系(更新至2021.6.18)
为了方便建立自己的知识体系,所以写下这篇引导文章
Android框架层
文章系列
文章数目
状态与备注
深入理解Handler消息机制
2篇
更新中
设计模式
6篇
更新中
自定义View
n篇
规划中
Java
文章系列
文章数目
状态与备注
深入浅出并发编程
1篇
规划中
设计模式(一) 面向对象六大原则
面向对象6大原则1 单一职责原则一个类的职责尽量单一,不要都写到一起,太臃肿,面向对象最基本的原则
2 开闭原则一个类,对于修改是封闭的,对于扩展是开放的,这是面向对象最重要的原则。频繁的修改一个类,也很容易出问题,通过扩展,不影响原有的功能,当然,完全不修改一个类是不可能的,但是我们一开始就应该多去考虑整个类的功能
3 里氏替换原则 理解一:子类可以实现父类的抽象方法,但是不可以实现非抽象方法,父类的非抽象方法一般都是设计好了的,重写非抽象方法,会破坏整个继承体系
理解二:将一个父类对象,替换成子类对象,程序不会发生错误和异常
4 依赖倒置原则定义:高层不依赖底层具体实现,而依赖其抽象
举例1:RecyclerView中的的addItemDecoration,参数为ItemDecoration抽象类,实际使用的时候自己传入实现类
12345public void addItemDecoration(@NonNull ItemDecoration decor) { addItemDecoration(decor, -1);}//抽象类public abstra ...
设计模式(六) 模板设计模式
一、模式介绍模板设计模式文章
辉哥:https://www.jianshu.com/p/949f44243963
https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/template-method/mr.simple
定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
角色介绍
AbstractClass : 抽象类,定义了一套算法框架。
ConcreteClass1 : 具体实现类1;
ConcreteClass2: 具体实现类2;
二、源码分析在Android源码中,哪些地方能体现出模板设计模式呢?这里总结如下两点
1.AsyncTask2.Activity
设计模式(五) 装饰器模式
定义:装饰器模式是继承的一种替代方案,但是比继承更加灵活
二、源码分析2.1ContextContext是一个抽象类,它的实现类是ContextImpl,但是如果有些功能ContextImpl实现不了,需要扩展ContextImpl的功能时,ContextWrapper就出现了,ContextWrapper持有ContextImpl,Application,Service,Activity都直接或者间接的继承ContextWrapper,这就体现出装饰器模式了,ContextWrapper装饰了ContextImpl
ContextWrapper中实现Context的方法全是通过它持有的mBase对象来实现的。这样它(ContextWrapper)派生出的子类就可以在不改变原始context(mBase对象)的情况下扩展Context的行为。 无论是 Activity、Service还是Application,它们本质都是一个 ContextWrapper,都是Context的一个具体装饰者的角色,都是通过持有 ContextImpl 对象,在 ContextImpl 的基础上进一步 ...
设计模式(四) 工厂模式
设计模式(四) 工厂模式
工厂模式主要分为三种
工厂方法
简单工厂
抽象工厂
一、三种工厂模式1、工厂方法一个抽象产品类,可以派生出多个具体产品类。一个抽象工厂类,可以派生出多个具体工厂类。每个具体工厂类只能创建一个具体产品类的实例。
如下图:
Concrete Product 具有共同的父类Product ,Concrete Factory也具有共同的父类Factory。每个具体的子类Concrete Factory 产出一个对应的Concrete Product
2、简单工厂定义:简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法)
一个抽象产品类,可以派生出多个具体产品类。一个具体工厂类,通过往此工厂的static方法中传入不同参数,产出不同的具体产品类实例。通常内部通过switch语句判断该生产哪个对象,或者通过泛型+反射来生成对象。
如上图所示,Concrete Product 具有共同的父类Product。工厂类Factory只有一个,通过向Factory的static方法中传入不同的参数,得到返回的不同的Concrete Product
3、抽象工厂多个 ...
设计模式(三) Builder建造者模式
Builder建造者模式
Builder建造者模式,主要用于构建一个复杂的对象,将对象的构建与表示分离,在不使用建造者模式的时候,我们构建一个复杂的对象,可能构造方法的参数都很七八个,如果是可选参数,那么可能会重载多个构造方法,当用户使用该类的时候,需要仔细观察,需要哪个构造方法,才能满足需求。使用Builder建造者模式就可以解决这个痛点
一、Android源码之AlertDialogAlertDialog 内部就是使用的建造者模式,核心类包括如下:
AlertDialog
AlertDialog.Builder
AlertController
AlertController.AlertParams
AlertDialog的基本使用:
123456AlertDialog.Builder(this)//1 .setTitle("标题")//2 .setMessage("消息内容") .setPositiveButton("确定",null ...
设计模式(二) 单例模式
单例模式1.1饿汉式12345678910111213/** * 单例模式-饿汉式 */public class SingleTon1 { private static SingleTon1 mInstance = new SingleTon1(); private SingleTon1() {//私有构造方法 } public static SingleTon1 getInstance() {//提供静态方法,获取对象实例 return mInstance; }}
1.2懒汉式懒汉式-线程不安全
123456789101112131415/** * 单例模式-懒汉式(线程不安全) */public class SingleTon2 { private static SingleTon2 mInstance; private SingleTon2() {} public static SingleTon2 getInstance ...
深入理解Handler消息机制
前言
消息机制预计共分为两篇,本篇为第一篇,基础篇,消息机制是在面试中必问的知识点,虽然现在在实际工作中,已经没怎么使用到handler,如我们可以使用rxjava来做线程切换,但其实其内部核心仍然是handler,只是做了一层高级封装,下面我们就来深入分析handler消息机制原理
handler消息机制所涉及到的类大致有以下五个
handler
Looper
MessageQueue
Message
ThreadLocal
整个消息机制分为如下展开:
handler是如何将消息发送到消息队列的?
message是如何添加到messageQueue中的?
Looper是如何轮询消息队列的?
Looper取出消息后,是如何分发到handler的handleMessage进行处理的?
一. handler是如何将消息发送到消息队列messageQueue的?我们最常使用的发送消息的sendMessage(),或者延迟发送sendMessageDelayed()最终都会走到enqueueMessage()方法
方法执行流程如下:
sendMessage() –> send ...
深入浅出并发编程
这是深入浅出并发编程,详细讲解并发编程的方方面面,在以后Android面试中,遇到并发问题,不再担忧,同时这些知识,也适用于Java开发
第一章:线程基础1.1什么是进程,线程,并发和并行,同步,异步?进程:进程可以简单理解为一个应用,如QQ,微信,抖音,一般来说,一个应用就是一个进程,进程是资源分配的最小单位
线程:一个进程可以有多个线程,线程是最小调度单位,线程也可以理解为一串代码指令
并发:线程轮流使用cpu叫做并发
并行:在多核情况下,两个任务可能同时执行,叫做并行
1.2创建线程有几种方式?两种方式:
继承Thread
使用Thread + Runnable
使用Thread是将线程和任务放在了一起,使用Runnable则将线程和任务分开,因为使用接口,比继承更加灵活
12345678// 创建线程对象Thread t = new Thread() { public void run() { // 要执行的任务 }};// 启动线程t.start();
123456789Runnable runnable = new Runna ...
动脑学院高级Android知识笔记
第一章 高手筑基基础技能1.1Java虚拟机1.JVM内存模型JVM共可划分为五大内存区域,如下所示
虚拟机栈
本地方法栈
程序计数器
堆
方法区
其中,虚拟机栈,本地方法栈,程序计数器是线程私有的,堆和方法区是线程共享的
栈帧的组成
局部变量表
操作数栈
动态链接
方法出口
堆内存的划分
年轻代和老年代,一般老年代占比80% 年轻代占比20%
年轻代划分为:
Eden区
Survivor区
from
to
GC算法:
Minor GC(Young GC):新生代GC,即目标只是新生代的垃圾收集
Major GC(Old GC):老年代GC,即目标只是老年代的垃圾收集
Full GC:整堆收集,收集整个Java堆和方法区的垃圾收集
参考文章:https://blog.csdn.net/Alpha_Paser/article/details/82533128
面试题:一个大对象分配内存会直接进入老年代吗?
答案:会,大对象直接进入老年代,避免在新生代的Eden和Survivor区来回复制,产生大量内存复制操作
知识点:在JVM五大内存区域中,只有程序计数器是没有内存溢出 ...