Android Annotation註解、RxJava、開源網絡庫

以下知識點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(訂閱者)代替

image

RxJava2.0 VS RxJava1.0

image

響應式拉取

    /**
     * 步驟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網絡請求框架

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拉取進行加載。從而實現埋點功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章