以下知識點Demo源碼已經上傳到github:
https://github.com/SunnyLy/ActivityLifeDemo
一、RxJava
響應式編程,流式控制。觀察者消費者模式。
分析的好的博文:https://www.jianshu.com/p/ceb48ed8719d
目前已經更新到RxJava3.0:
RxJava2.0 VS RxJava1.0:主要是RxJava採用背壓策略,解決了RxJava1.0中因爲被觀察者(Observable)發送事件速度 與觀察者(Observer)接收事件速度不匹配,從而造成數據緩衝區消息積壓,導致OOM的問題。
背壓策略(BackPress)
根據觀察者的響應式拉取(接收能力及反饋),對超出緩衝區大小的事件進行丟棄、保留、報錯等措施。(類似線程池中,超過線程池中最大線程數時的處理策略)
在RxJava2.0中,用Flowable替代RxJava1.0中的Observalable來實現背壓。同時觀察者Observer也被Suscriber(訂閱者)代替
RxJava2.0 VS RxJava1.0
響應式拉取
/**
* 步驟1:創建被觀察者 = Flowable
*/
Flowable<Integer> upstream = Flowable.create(new FlowableOnSubscribe<Integer>() {
@Override
public void subscribe(FlowableEmitter<Integer> emitter) throws Exception {
// 被觀察者發送事件數量 = 4個
Log.d(TAG, "發送了事件1");
emitter.onNext(1);
Log.d(TAG, "發送了事件2");
emitter.onNext(2);
Log.d(TAG, "發送了事件3");
emitter.onNext(3);
Log.d(TAG, "發送了事件4");
emitter.onNext(4);
emitter.onComplete();
}
}, BackpressureStrategy.ERROR);
/**
* 步驟2:創建觀察者 = Subscriber
*/
Subscriber<Integer> downstream = new Subscriber<Integer>() {
@Override
public void onSubscribe(Subscription s) {
Log.d(TAG, "onSubscribe");
s.request(3);//Subscription.request()爲響應式拉取,即設置觀察者的接收能力
// 觀察者接收事件 = 3個 ,即不匹配
}
@Override
public void onNext(Integer integer) {
Log.d(TAG, "接收到了事件 " + integer);
}
@Override
public void onError(Throwable t) {
Log.w(TAG, "onError: ", t);
}
@Override
public void onComplete() {
Log.d(TAG, "onComplete");
}
};
/**
* 步驟3:建立訂閱關係
*/
upstream.subscribe(downstream);
二、Android網絡請求框架
三、Annotation註解、APT註解工具 、 AOP面向切面
- 註解原理 及框架
java中註解是利用java.lang.annotation中的Annotation接口,主要目的就是用於給java代碼動態插入元數據。而註解的提取則是由**APT(Annotation Processor Tool) ** 負責。而這種處理註解的方式根據註解信息生命週期來分的話主要有兩種:- 編譯時(信息只會保留在編譯期的class文件中,運行時無法獲取註解元數據)
- 運行時 (信息會一會保留,運行時可獲取)
註解處理方式 | 原理 | 特點 |
---|---|---|
編譯時 | row 1 col 2 | 1,註解信息只會保留在編譯階段的class文件中,運行時無法獲取2、相對性能好一點 |
運行時 | 利用java反射機制實現, 2 | 1,註解信息一起保留到運行時;2、因爲是利用Java反射,所以性能會差一點| |
https://blog.csdn.net/u012758497/article/details/86379615
- AOP 原理 及框架
AOP面向切面編程,是一種編程思想,利用註解來實主現,主要知識點如下:
關鍵類/接口 | 註釋 | 用法| |
---|---|---|
JoinPoint | 表示連接點,提供利用反射獲取當前連接點的方法名,參數,上下文等信息的方法 | |
ProceedingJoinPoint | 爲JoinPoint子類,proceed()爲其重要方法,表示執行切入點方法裏面的方法體 | joinPoint.proceed(); |
PointCut | AOP中註解,用來定義切入點(也叫插樁): 1、call表示只調用方法,不執行; 2、execution:表示執行某方法 |
先自定義一個方法,用來表示此切入點信息,如下:@Pointcut("execution(@ext.sunny.com.aoplib.permission.PermissionsNeeded * *(..)) && @annotation(needPermission)")fun requestPermissionMethod(needPermission:PermissionsNeeded) {Log.e("aop", "AOP>>>>>找到了插入點")} |
Advice | 消息處理中心,也就是業務邏輯處理中心。主要包括以下幾種: 1、Around:代碼編織處,只將編織的新代碼替換到切入點的代碼; 2、Before:在切入點之前執行(比如:在執行某一個方法前,進行非空判斷或者加入埋點統計) 3、After:在切入點之後執行。 |
- 無痕埋點
就是利用Aop的原理,我們可以將這些需要進行埋點的地方,進行單獨的代碼編寫,以jar包的形式放在服務器,然後由App拉取進行加載。從而實現埋點功能。