RxJava-android三方框架
简述
RxJava是用来干嘛的? 异步,为处理异步而生!!!
在安卓中,执行耗时操作,除了使用自带的API来创建子线程,也可以用一些其他的框架,其中RxJava就是。
前提
对于RxJava的实现是使用了观察者模式的,这个需要先了解一下观察者模式
使用
先来看一段代码
TextView tv = findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
在这段代码中,对比观察者,tv是被观察者,new的内部类是观察者,setOnClickListener是建立关系的桥梁,当tv改变后,会通知内部类,内部类会做出响应。
ok,进入正题
先创建观察者:
方式1:
Observer<String> observer = new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
};
方式2:
Subscriber<String> stringSubscriber = new Subscriber<String>() {
@Override
public void onSubscribe(Subscription s) {
}
@Override
public void onNext(String s) {
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
}
};
比较容易看到的是没有什么具体的区别,事实上,从源码来看,好像有一个onStart的区别,后续研究源码再附。
创建被观察者
create方法
Observable<String> subscribe = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
}
});
just方法
Observable<String> just = Observable.just("A", "B", "C");
fromArray方法
String[] arr = {"A","B","C"};
Observable<String> observable = Observable.fromArray(arr)
这里的create,just,fromArray称为操作符,RxJava有很多的操作符,具体可以参考RxJava操作大全
订阅
observable.subscribe(observer);
// 或者:
observable.subscribe(subscriber);
从逻辑上看是被观察者订阅观察者,这样设计的原因是为了流式 API 的设计。
那么RxJava是怎样实现异步处理的呢,看代码
int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable = getTheme().getDrawable(drawableRes));
subscriber.onNext(drawable);
subscriber.onCompleted();
}
})
.subscribeOn(Schedulers.io()) /***/ 指定上面的call发生在 IO 线程***
.observeOn(AndroidSchedulers.mainThread()) /***/ 指定 下面的subscriber 的回调发生在主(UI)线程***
.subscribe(new Observer<Drawable>() {
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
}
});
RxJavad的学习学不完
这个框架的用法是很多的,操作符真的太多了,到用的时候再补充吧