Rxjava3序言
Rxjava3
Rxjava其实在很早以前有过学习和了解,但是当时由于没有记笔记的习惯,难以整理成体系化的笔记,零零散散。
本系列笔记学习基于io.reactivex.rxjava3:rxjava:3.1.6
概念RP
RP即Reactive Programming(响应式编程)
所谓的响应式即变化是可传播的,即发生变化后这种变化会如同”病毒“一样扩散出去。
假如计算一个式子
c = a + b
命令式和响应式写法如下
None RP
123456789101112131415161718public class NoneRP { public static void main(String[] args) { int a = 1; int b = 2; int c = a + b; // 3 System.out.println(c); a = 2; b = 3; // 由于逻辑处理没有采用响应式,所以a b的变化不会扩散到c,即abc的值 ...
Http2连接建立
Http/2连接建立过程
Http协议概述
http2支持http1.1的所有功能,并比http1.1更高效
HTTP/2 中的基本协议单元是一个帧。每种帧类型都有不同的用途。
协议标识HTTP/2有两个版本标识:
h2: 构建与TLS之上的HTTP/2协议实现, 在连接的TLS握手阶段, 通过TLS扩展协议的ALPN字段标识。
h2c: 基于明文的TCP传输的协议实现, 在HTTP1.1升级协商阶段的Upgrade字段标识。无安全性保障。
h2c
在并不知道对方是否支持http2的情况下。
http客户端通过使用http升级机制建立http2连接
客户端发送
12345GET / HTTP/1.1Host: server.example.comConnection: Upgrade, HTTP2-SettingsUpgrade: h2cHTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
服务端响应(如果不支持http2连接)
1234HTTP/1. ...
Android线程通信
Handler
Android是支持多线程的,不同线程如何进行通信,底层就是依靠的Handler进行通信。
这里的Handler不是指的Java的Handler,更确切的说是Handler机制。
熟知的有Java层的Handler,但是被遗忘的有Native 层的Handler。
Java的线程通信事件处理是由Java/Native两层Handler共同协作完成。
结构跨线程通信需要用到如下类
Handler
信息的传递者,如果某个线程有通信的需要就需要持有一个Handler对象,由Handler对象完成线程间信息的传递。
同时也是消息的处理者
Looper
默认情况下的线程是不支持通信的,因为默认情况线程是顺序执行,停下来时线程就停止了。而Looper即是对于线程的一层封装让其死循环去寻找事件。
MessageQueue
事件的容器
Message
事件实体,包含了信息
使用
Looper准备
1Looper.prepare()
handler实例化
12345val handler = Handler(Looper.myLoope ...
Android Process基础之创建
Android ProcessJava Process API
直接通过Java Process API创建
123456789101112131415161718192021const val TAG = "com.example.process"class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // 创建进程并开启 val process = ProcessBuilder("echo","hello world") .start() // 等待至进程退出 val waitFor = process.waitFor() // 如果 ...
Java Thread
Java Thread构造函数
数目很多,但是全部都会调用到private的6参构造方法
1234567891011121314151617181920212223242526272829303132333435363738public Thread() { this(null, null, "Thread-" + nextThreadNum(), 0);}public Thread(Runnable target) { this(null, target, "Thread-" + nextThreadNum(), 0);}public Thread(String name) { this(null, null, name, 0);}public Thread(ThreadGroup group, Runnable target) { this(group, target, "Thread-" + nextThreadNum(), ...
Java Process
Java基础之Process
进程属于是操作系统的资源,Java对其亦是开箱支持的
相关的类有
java.lang.Process
java.lang.ProcessBuilder
java.lang.ProcessHandle
Process
Process是一个抽象类,只有一套模板
1public abstract class Process
IO12345public abstract OutputStream getOutputStream();public abstract InputStream getInputStream();public abstract InputStream getErrorStream();
同步12// 使得当前线程一直等待,直到进程执行完毕public abstract int waitFor() throws InterruptedException;
1234567891011121314151617181920// 等待指定时间,超时即退出public boolean waitFor(long timeout, ...
Gradle之C/S通信
Gradle Connector连接建立
Client和Server通常运行在不同的进程,不同进程的通信最常用的就是socket。
确实Gradle也是使用的socket建立C/S的连接
对于Gradle来说一个连接既是
1234public interface Connection<T> extends Dispatch<T>, Receive<T>, Stoppable {}public class DaemonClientConnection implements Connection<Message> {}
所以如果想要创建连接即是实例化一个此类的对象。
DaemonClient.java
如下
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748public BuildActionResult execute(BuildAction act ...
HTTP缓存
HTTP缓存
参考自MDN文档
什么是HTTP缓存
缓存是一种思想。为了加速效率,把经常访问的内容保存下来。之后就不需要经过低效率的渠道获取内容从而提升效率。
缓存术语
缓存有效期(max-age)
数据是变动的,一旦缓存就要考虑数据的一致性,HTTP的协议制定者也不是傻子,也考虑到了这点,所以缓存是有一个时限的。
新鲜(fresh)
如果一个缓存在它的时限之内,则是新鲜的
过时(stale)
如果一个缓存在它的时限之外,则是过时的
共享缓存Public cache
缓存可能存放在公共网络中,即CDN等公共网络缓存设备可以对请求进行缓存(开发者应避免个人信息的泄露)
私有缓存Private cache
缓存可以存放在本地,这部分是用户独享。
存储Store respose
对可缓存的响应报文进行存储(存放不代表一定能复用)
复用Reuse response
缓存命中,使用缓存
验证Revalidate response
询问服务器当前持有的缓存是否过期(通常用于协商缓存)
新鲜响应Fresh response
缓存没有过期,可以使用
过期响应Stale resp ...
OkHttp全解析之Http & Websocket
Okhttp-http基础信息
依赖信息
1implementation("com.squareup.okhttp3:okhttp:4.10.0")
作用
可用于http及websocket的Http Client请求框架
关键概念
HTTP网络请求中涉及2个重要概念
Request
Response
即请求和响应
Okhttp的设计上为了贴合现实的网络请求,规划了5个类
OkHttpClient
客户端实体,可以进行网络请求细节的配置
Request
客户端网络请求报文
Response
服务端网络请求响应报文
Call
HTTP请求
WebSocket
Websocket请求
Okhttp做的很好的一点是使用者基本上只需要和上面几个类打交道
http请求
123456789val request = Request.Builder() .url("https://www.example.com") .headers(Headers.headersOf()) .metho ...
Gradle启动之Client
Gradle启动之Client
在本文以前,我们分析了
gradle批处理
gradle-wrapper
接下来我们需要分析
Gradle Client的启动过程
Pre基本概述
Gradle是C/S架构的一个java 程序
gradlew实际是用来启动gradle-client进程,
接着client进程会尝试连接后台的守护进程也即是gradle daemon,然后通过socket进行通信。
准备
即进行源代码调试方面相关的环境配置
Gradle既然是一个纯Java程序那么我们肯定是可以调试的。
参考自idea官方文档——remote debug
创建Remote Debug Configuration
Note:
在gradle源码工程创建,方便到时候直接连接。
保持默认配置
复制Command line arguments for remote JVM
1-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
agentlib: 指定java agen ...