RxJava的学习笔记

时间:2023-01-28 17:49:39

RxJava的学习笔记

RxJava 在 GitHub 主页上的自我介绍是 “a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。这就是 RxJava ,概括得非常精准。其实就是异步简洁

官方GitHub:

RxJava:https://github.com/ReactiveX/RxJava

RxAndroid:https://github.com/ReactiveX/RxAndroid

RxBinding:https://github.com/JakeWharton/RxBinding(Android中绑定View)

官方文档:http://reactivex.io/documentation/observable.html

先来看一个简单的例子

    //被观察者
Observable.OnSubscribe<String> onSubscribe = new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello world");
subscriber.onCompleted();
}
};

//观察者
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}

@Override
public void onError(Throwable e) {}

@Override
public void onNext(String s) { System.out.println(s); }
};
//订阅
Observable.create(onSubscribe).subscribe(subscriber);

我们还可以换另外一种方式来写,Lambda,当然需要在项目中添加lambda的插件,这里就不说明了

Observable.just("Hello world").subscribe(s -> System.out.println(s));

使用Lambda是不是很简单呢?
下面在来个稍微复杂一点的例子,需要显示多张图片:

new Thread() {
@Override
public void run() {
super.run();
for (File folder : folders) {
File[] files = folder.listFiles();
for (File file : files) {
if (file.getName().endsWith(".png")) {
final Bitmap bitmap = getBitmapFromFile(file);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
imageCollectorView.addImage(bitmap);
}
});
}
}
}
}
}.start();

使用RxJava是这样的

Observable.from(folders)
.flatMap(new Func1<File, Observable<File>>() {
@Override
public Observable<File> call(File file) {
return Observable.from(file.listFiles());
}
})
.filter(new Func1<File, Boolean>() {
@Override
public Boolean call(File file) {
return file.getName().endsWith(".png");
}
})
.map(new Func1<File, Bitmap>() {
@Override
public Bitmap call(File file) {
return getBitmapFromFile(file);
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imageCollectorView.addImage(bitmap);
}
});

使用RxJava+Lambda是这样的

Observable.from(folders)
.flatMap((Func1) (folder) -> { Observable.from(file.listFiles()) })
.filter((Func1) (file) -> { file.getName().endsWith(".png") })
.map((Func1) (file) -> { getBitmapFromFile(file) })
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe((Action1) (bitmap) -> { imageCollectorView.addImage(bitmap) });

原文参考给Android开发者的RxJava的详解