RxJava是基于觀察者模式實現的。
RxJava 在 GitHub 主頁上的自我介紹是 "a library for composing asynchronous and event-based PRograms using observable sequences for theJavaVM"(一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫)。RxJava本質上是實現異步操作的庫。
異步操作很關鍵的一點是程序的簡潔性,因為在調度過程比較復雜的情況下,異步代碼經常會既難寫也難被讀懂。 Android 創造的 AsyncTask 和Handler ,其實都是為了讓異步代碼更加簡潔。RxJava 的優勢也是簡潔,但它的簡潔的與眾不同之處在于,隨著程序邏輯變得越來越復雜,它依然能夠保持簡潔。
在開始之前,先學習一下RxJava的主要屬性和方法:
Observable:(可觀察者,即被觀察者),在需要時發出事件
Observer:(觀察者),觀察者處理事件
Subscribe:(訂閱)事件,Observable 和 Observer 通過 subscribe() 方法實現訂閱關系,從而 Observable 可以在需要的時候發出事件來通知 Observer
subscribeOn(AndroidSchedulers.io()):事件發生在io線程,即Observable.onSubscribe被激活時所處的線程(事件產生線程)
observeOn(AndroidSchedulers.mainThread()):事件處理在子線程中,(事件消費線程)
RxJava采用『后臺線程取數據,主線程顯示』的程序策略
compile 'io.reactivex:rxandroid:1.1.0' compile 'io.reactivex:rxjava:1.1.0'
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) {
//可在此方法中執行耗時操作,請求網絡等
subscriber.onNext("努力"); subscriber.onNext("拼搏"); subscriber.onNext("樂觀"); subscriber.onNext("負責"); subscriber.onNext("擔當"); } });
observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread());
/** * 在 subscribe 剛開始,而事件還未發送之前被調用,可以用于做一些準備工作, * 例如數據的清零或重置。這是一個可選方法,默認情況下它的實現為空 * 不可指定線程,在Subscriber所發生的線程中調用 * 要在指定的線程來做準備工作,可以使用 doOnSubscribe() 方法*/
Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onCompleted() { //事件完成時調用執行 } @Override public void onError(Throwable e) { //事件出錯時調用執行 } @Override public void onNext(String s) { Log.e("schedulerSubscriber", "onNext: " + s ); //事件消費時調用執行 } };
observable.subscribe(subscriber);
第一種:Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext(" "); ....
} });
第二種:Observable.just( , , , );
第三種:Observable.from( );(括號中是數組)
Observable.subscribe(new Action1( Object obj){
.....
});
Action0 是 RxJava 的一個接口,它只有一個方法 call(),這個方法是無參無返回值的
Action1 也是一個接口,它同樣只有一個方法 call(T param),這個方法也無返回值,但有一個參數
Observable持有Context時會導致內存泄漏(創建Subscription時,會以某種方式持有了Context的引用,如果沒有及時的結束,內存占用會越來越大)
解決方法:在生命周期的某個時刻及時的取消訂閱(使用CompositeSubscription來持有所有的subscriptions,然后在onDestory()或onDestoryView()里取消所有的訂閱)
持有:compositeSubscription.add(subscription);
取消:compositeSubscription.unsubscribe();
新聞熱點
疑難解答