一、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) { //請求成功 } });