RxJava
為何使用
與AysncTask與Handler相較下程式碼簡潔,可讀性高,可控制的狀態多
使用方式
使用Grandle方式加入依賴Rxjava依賴:
//RxJava
compile 'io.reactivex.rxjava2:rxjava:2.1.5'
//RxAndroid
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
RxJava基本用法
1.創建觀察者Observer
Observer observer = new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
Logger.d(s);
}
@Override
public void onError(@NonNull Throwable e) {
Logger.d(e.getMessage());
}
@Override
public void onComplete() {
Logger.d("***onComplete***");
}
};
2.創建被觀察者Observable
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
//加入兩個事件
e.onNext("dayongxin");
e.onNext("DoubleDa");
e.onComplete();
}
});
3.執行與創建訂閱
observable.subscribe(observer);
4.整合使用範例
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(@NonNull ObservableEmitter e) throws Exception {
e.onNext("dayongxin");
e.onNext("DoubleDa");
e.onComplete();
}
}).subscribe(new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
Logger.d(s);
}
@Override
public void onError(@NonNull Throwable e) {
Logger.d(e.getMessage());
}
@Override
public void onComplete() {
Logger.d("***onComplete***");
}
});
一些常用操作符----
5.定時Task
建立一個按照固定時間間格發射整數序列的Observable,相當於定時器。
Observable.interval(5, TimeUnit.SECONDS).subscribe(new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull Long aLong) {
Logger.d(aLong);
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
6.zip
zip操作碼並且兩個或多個Observable發射出的數據項,根據指定的函數變換它們,並發射一個新值。
Observable observable1 = Observable.just("a", "b", "c");
Observable observable2 = Observable.just(1, 2, 3);
Observable.zip(observable1, observable2, new BiFunction() {
@Override
public String apply(@NonNull String s, @NonNull Integer integer) throws Exception {
return s + integer;
}
}).subscribe(new Observer() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull String s) {
//Do something..
}
@Override
public void onError(@NonNull Throwable e) {
}
@Override
public void onComplete() {
}
});
7.Scheduler
Scheduler:線程控制器,可以指定每一段代碼在什麼樣的線程中行為。
在RxJava中,存在一個未指定的線程情況,默認會使用當前線程,若是操作中有耗时的操作,會導致線程阻塞。
如何使用Scheduler控制線程:
Sample:
private void rxHelloWord() {
Observable.just("Hello", "RxWord!")
.subscribeOn(Schedulers.newThread())//指定 subscribe() 發生在新的線程
.observeOn(AndroidSchedulers.mainThread())// 指定 Subscriber 的回調發生在主線程
.subscribe(new Action1() {
@Override
public void call(String s) {
Log.i(TAG, s);
}
});