RxJava梳理

響應式編程

什麼是響應式編程
經過異步數據流來構建事務關係的編程模型
算法

舉例
app啓動時, 先初始化sdk, 初始化數據庫, 登陸, 都成功後跳轉首頁, 他們都須要耗時操做數據庫

Observable.just(context)
            .map((context)->{login(getUserId(context))})
            .map((context)->{initSDK(context)})
            .map((context)->{initDatabase(context)})
            .subscribeOn(Schedulers.newThread())
            .subscribe((context)->{startActivity()})
複製代碼
  • 其實,這種寫法並非響應式的,本質上仍是建立一個子線程,而後順序調用代碼最後跳轉頁面。這種代碼依然沒有忠實反映業務之間的關係
Observable obserInitSDK=Observable.create((context)->{  initSDK(context) }).subscribeOn(Schedulers.newThread())

Observable obserInitDB=Observable.create((context)->{  initDatabase(context) }).subscribeOn(Schedulers.newThread())

Observable obserLogin=Observable.create((context)->{    login(getUserId(context))   })
                              .map((isLogin)->{ return  Context()   })
                            .subscribeOn(Schedulers.newThread())
                            
Observable observable = Observable.merge(obserInitSDK,obserInitDB,obserLogin)

observable.subscribe(()->{startActivity()})
複製代碼
  • 你們應該能很明顯看到兩段代碼的區別,第二段代碼徹底遵守了業務之間客觀存在的關係,能夠說代碼和業務關係是徹底對應的。
  • 那麼這帶來了什麼好處呢?當initSDK,initDB,Login都是耗時較長的操做時,遵守業務關係編寫響應式代碼能夠極大的提升程序的執行效率,下降阻塞。
  • 理論上講,遵守業務關係運行的代碼在執行效率上是最優的

RxJava經常使用用法

建立被觀察者的幾種方式編程

//1
Observable switcher = Observable.create(new Observable.OnSubscribe<String>(){
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("On");
                subscriber.onCompleted();
            }
        });
//2
Observable switche r= Observable.just("On","Off","On","On");
//3
String [] kk={"On","Off","On","On"};
Observable switcher = Observable.from(kk); 
複製代碼

建立觀察者的幾種方式bash

//1
Subscriber light = new Subscriber<String>() {
            @Override
            public void onCompleted() {
                //被觀察者的onCompleted()事件會走到這裏;
                Log.d("DDDDDD","結束觀察...\n");
            }

            @Override
            public void onError(Throwable e) {
                    //出現錯誤會調用這個方法
            }
            @Override
            public void onNext(String s) {
                //處理傳過來的onNext事件
                Log.d("DDDDD","handle this---"+s)
            }
//2 偷懶(非正式寫法)
Action1 light = new Action1<String>() {
                @Override
                public void call(String s) {
                    Log.d("DDDDD","handle this---"+s)
                }
            }
複製代碼

將二者訂閱在一塊兒數據結構

switcher.subscribe(light);
複製代碼

之因此「開關訂閱檯燈」, 是爲了保證流式API調用風格app

RxJava經常使用操做符

Map類型變換異步

Observable.just(getFilePath()
            .subscribeOn(Schedulers.newThread())        //指定了被觀察者執行的線程環境
            .observeOn(Schedulers.io())                 //將接下來執行的線程環境指定爲io線程
                    //使用map操做來完成類型轉換
            .map(new Func1<String, Bitmap>() {
              @Override
              public Bitmap call(String s) {
                  return createBitmapFromPath(s);       //方法,是一個極其耗時的操做
              }
          })
            .observeOn(AndroidSchedulers.mainThread())  //將後面執行的線程環境切換爲主線程
            .subscribe(
                  new Subscriber<Bitmap>() {            //建立觀察者,做爲事件傳遞的終點處理事件   
                        
                        @Override
                        public void onNext(Bitmap s) {
                            showBitmap(s)               //處理事件
                        }
                    );
複製代碼

FlatMapide

//建立被觀察者,獲取全部班級
 Observable.from(getSchoolClasses())
                .flatMap(new Func1<SingleClass, Observable<Student>>() {
                    @Override
                    public Observable<Student> call(SingleClass singleClass) {
                        //將每一個班級的全部學生做爲一列表包裝成一列Observable<Student>,將學生一個一個傳遞出去
                        return Observable.from(singleClass.getStudents());      //返回Observable
                    }
                })
                .subscribe(
                //建立觀察者,做爲事件傳遞的終點處理事件    
                  new Subscriber<Student>() {
                        @Override
                        public void onNext(Student student) {
                            //接受到每一個學生類
                            Log.d("DDDDDD",student.getName())
                        }
                    );
複製代碼

FlatMap能夠再次包裝新的Observable,而每一個Observable均可以使用from(T[])方法來建立本身ui

map和flatmap的原理this

RxJava2經常使用操做符教程

爲何避免使用RxBus

粘性事件:就是能夠接收訂閱以前的事件

ViewMode+LiveData 模式 編譯原理,數據結構,操做系統,計算機組成原理 KMP算法

相關文章
相關標籤/搜索