RxJava總結(原)

一、RxJava的做用  java

    RxJava is a Java VM implementation of Reactive Extensions: a library for composing asynchronous and event-based programs by using observable sequences.react

    It extends the observer pattern to support sequences of data/events and adds operators that allow you to compose sequences together declaratively while abstracting away   concerns about things like low-level threading, synchronization, thread-safety and concurrent data structures.設計模式

    說白了就是你們都說的讓你能一眼看出來你以前作什麼,以後作什麼。它不是簡化了代碼,而是簡化了邏輯。它具備線程安全性。安全

二、RxJava的原理async

   RxJava是基於觀察者模式的。用戶定義Observer以後,提供一個Observerble,由Observerble進行subscribe,就安心等待結果就行。ide

   RxJava能夠進行事件的排序操做,使用了decorate設計模式和攔截器模式進行操做。在操做的過程當中將過程大量的封裝爲OnSubscribe對象,配合Scheduler完成包裝。ui

  

使用下面一行代碼開啓循環調用,直至完成事件。spa

    

Subscriber<? super T> st = hook.onLift(operator).call(o);
try {
    // new Subscriber created and being subscribed with so 'onStart' it
    st.onStart();
    onSubscribe.call(st);
} catch (Throwable e) {
    ...
}

 

三、RxJava的實現線程

  

四、RxJava的流程設計

  

五、RxJava的使用

   5.1 簡單的使用

    5.1.1 建立觀察者

    5.1.2 建立被觀察者

    5.1.3 調用subscribe方法進行訂閱。

private void subscribe1() {
        //建立一個觀察者
        Observer<String> observer = new Observer<String>() {

            @Override
            public void onCompleted() {
                Log.i(TAG, "Completed");
            }

            @Override
            public void onError(Throwable e) {
                Log.i(TAG, "Error");
            }

            @Override
            public void onNext(String s) {
                Log.i(TAG, s);
            }
        };
        //使用Observable.create()建立被觀察者
        Observable observable1 = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello");
                subscriber.onNext("Wrold");
                subscriber.onCompleted();
            }
        });
        //訂閱
        observable1.subscribeOn(Schedulers.newThread()).observeOn(Schedulers.io()).doOnNext(new Observable.OnSubscribe() {
            @Override
            public void call(Object o) {
                System.out.println(o.toString());
            }
        }).subscribe(observer);
    }

  5.2 Retrofit和RxJava的配合:Retrofit和RxJava配合使用時,Retrofit的CallAdapter使用RxJavaCallAdapterFactory生成返回值爲Observable<T>的對象。使用該對象進行subscribe操做便可。    

    5.2.1 定義返回數據      

public class UserInfo {
    public String username;
    public String password;
}

    5.2.2 定義接口,返回值爲Observable<T>,即爲被觀察者對象

interface MyService {
    @GET("user/login")
    Observable<UserInfo> login(
            @Query("username") String username,
            @Query("password") String password
    );
}

    5.2.3 生成Retrofit對象,配置CallAdapterFactory爲RxJavaCallAdapterFactory。

Retrofit retrofit = new Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())//新的配置
                .baseUrl(BASE_URL)
                .build();

    5.2.4 生成代理類,即被觀察者

MyService service = retrofit.create(MyService.class);

    5.2.5 配置事件鏈和Scheduler,訂閱;

String phone = "123";
        String password = "123";
        service.login(phone, password)               //獲取Observable對象
                .subscribeOn(Schedulers.newThread())//請求在新的線程中執行
                .observeOn(Schedulers.io())         //請求完成後在io線程中執行
                .doOnNext(new Action1<UserInfo>() {
                    @Override
                    public void call(UserInfo userInfo) {
                        saveUserInfo(userInfo);//保存用戶信息到本地
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())//最後在主線程中執行
                .subscribe(new Subscriber<UserInfo>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        //請求失敗
                    }

                    @Override
                    public void onNext(UserInfo userInfo) {
                        //請求成功
                    }
                });
相關文章
相關標籤/搜索