记一次Java类型强转
背景
在刷一道Leetcode题
剑指 Offer 19. 正则表达式匹配
对照了答案,使用了DP对此题进行求解,由于没有完全抄题解的,所以有部分内容不完全一致。
但是就逻辑上和题解完全一致。可就是无法通过OJ
源代码
官方题解
1234567891011121314151617181920212223242526272829303132333435class Solution { public boolean isMatch(String s, String p) { int m = s.length(); int n = p.length(); boolean[][] dp = new boolean[m + 1][n + 1]; dp[0][0] = true; for(int i = 0;i <= m; i++) { for(int j = 1;j <= n; j++) { if(p.c ...
Glide Request构建
Glide Request
Glide在加载图片的第一步既是初始化Glide实例
接着就会获取RequestManager,然后初始化一个RequestBuilder构建一个Request,
本文会对于Glide的RequestBuilder实例化过程做解析
begin
Glide的创建是在Glide.with内部进行的,通过with以后就能得到一个RequestManager的实例化对象
1Glide.with(this)
RequestManager
关于RequestManager公开的api如下
request hook
addDefaultRequestListener
为所有由该RequestManager构建的Request添加监听。
applyDefaultRequestOptions
对Request进行默认配置
加载任务
as
进行RequestBuilder的实例化
1234public <ResourceType> RequestBuilder<ResourceType> as( @Non ...
Glide初始化分析
Glide Initial
Glide的初始化方法比较单一
无法无法使用
init
直接调用初始化,会初始化Glide内的static成员
get
初始化并获取Glide的实例
with
初始化Glide并依据传入的组件获取绑定响应生命周期的Manager对象,以便后续构建Request。
其中最为常用的既是with方法。with基本上包含了init和get方法的所有内容。
123public static RequestManager with(@NonNull Context context) { return getRetriever(context).get(context);}
123public static RequestManager with(@NonNull FragmentActivity activity) { return getRetriever(activity).get(activity);}
123public static RequestManager with(@Non ...
Glide核心原理概览
Glide主线流程
Glide是一个图片加载库
Glide通过压缩和缓存,解决了图片内存占用大的问题
Glide的过程大致分为5步
Glide初始化
生命周期绑定(Glide -> RequestManager)
请求构建(RequestManager -> RequestBuilder)
请求配置(RequestBuilder -> RequestBuilder)
发起请求资源获取,解码,转化,呈现(RequestBuilder -> Target)
Note:
前4步通常是在Main线程,主要是做好Request的配置
最后一步最为复杂也最为重要,完成资源获取和界面呈现。其中资源获取在后台线程,然后界面的呈现为main线程。
尺寸优化
Glide会自定依据ImageView的大小对图片进行缩放,以免图像的像素过高导致Bitmap无法分配或者OOM的问题
Bitmap缓存
Glide在加载过程中有使用缓存来加速图片的加载,其中Bitmap会被缓存到BitmapPool中
其中BitmapPool采用了LRU的淘汰策略,即淘汰最近最少使 ...
Glide基础使用
Glidestart up安装12345678910111213plugins { //...... id 'org.jetbrains.kotlin.kapt'}dependencies { // https://mvnrepository.com/artifact/com.github.bumptech.glide/glide implementation("com.github.bumptech.glide:glide:4.15.1") kapt("com.github.bumptech.glide:compiler:4.15.1") // ......}
基础使用
加载图片
123Glide.with(fragment) .load(myUrl) .into(imageView);
取消加载
1Glide.with(fragment).clear(imageView);
自定义request
Glide提供独立 ...
Okio原理解析
Okio原理
基于okio:3.3.0,JVM
Okio有如下优点
简单
指的是它的类关系满足迪米特原则,牵扯少,只有Sink/Source仅凭其可完成所有的IO
高效
发生io时的缓存做了池化处理避免了频繁的内存分配,Sink/Source是由Segment构成的,而Segment的获取会从SegmentPool获取
跨平台
使用了Kotlin Multiplatform插件实现类JVM/Js/Native多平台的兼容
Segment
通常的Segment是一个循环链表
对象创建123456789101112131415constructor() { // const val SIZE = 8192 this.data = ByteArray(SIZE) this.owner = true this.shared = false}constructor(data: ByteArray, pos: Int, limit: Int, shared: Boolean, owner: Boolean) ...
Okio基础使用
Okio使用篇
Note: okio版本为3.3.0
Okio是一个用于io操作的框架
Okio的出现源于java.io以及java.nio不够简洁,不易使用,学习成本大
Okio解决了上手成本的问题
目前okio已经由kotlin重写,并使用了kotlin multiplatform实现跨平台
这已是Okio的几乎所有类
from doc
Okio组成ByteString & Buffer
ByteString
String的增强类,其中包含二进制编码,Base64,UTF-8编码,等。
Buffer
byte[]的增强,Buffer的组织不同于byte[],Buffer的数据会形成一个链表结构,一个节点只是类的一部分。
Source & Sink
Source
Sink
类似于java.io中的InputStream和OutputStream,不同的是Source/Sink类关系更少,方法更少,更简单,并且还提供了Timeout机制,允许使用者自定义超时策略
ByteString
ByteString是String的争抢版, ...
Gson源代码解析
Gson源码解析
源码版本基于2.10.1
分析方向
由于Gson是用于做序列化和反序列的一个框架。所以核心方法也就两个
toJson
fromJson
后续也只会对如上两个方法进行分析
toJson
toJson方法有不少的重载方法,不过按类型划分就两种。
Object -> String
JsonElement -> String
由于JsonElement用于序列化的情况比较少见,所以真正采用的只有Object-> String的序列化
之后会对public String toJson(Object src) 进行分析
12345678public String toJson(Object src) { // 对null值进行序列化 if (src == null) { return toJson(JsonNull.INSTANCE); } // 非空值序列化 return toJson(src, src.getClass());}
非null object序列化
1234 ...
Gson之基础使用篇
Gson基础使用
Gson属于是Java生态的必备技能,很有必要深入学习。
依赖引入
Gradle
123dependencies { implementation 'com.google.code.gson:gson:2.10.1'}
Maven
12345<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.10.1</version></dependency>
什么是Gson
Gson是一个Google开源的JSON序列化和反序列化框架
Gson设计目标
提供一个简单如toString方法般的机制实现Java对象到JSON字符串的互相转化
对于预定义的Java Bean实现无侵入式
允许自定义对象的序列化和反序列化
生成紧凑的、可读的JSON输出
使用Gson
Gson采用的是门面模式, ...
Android源码构建
Android 源码编译基础要求硬件要求官网链接
环境配置官方链接
源码下载创建文件夹1mkdir aosp
安装源代码控制工具1234mkdir ~/binPATH=~/bin:$PATHcurl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a+x ~/bin/repo
配置repo12vim ~/.bashrcexport REPO_URL='https://mirrors.bfsu.edu.cn/git/git-repo'
初始化镜像仓库分支列表
1repo init -u https://mirrors.bfsu.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r47
编译设置环境1source build/envsetup.sh
选择编译目标1lunch
构建类型
使用情况
user
权限受限;适用于生产环境
userdebug
与 ...