???在GitHub里面,RxJava的官方定義是: "a library for composing asynchronous and event-based programs using observable sequences for the Java VM" 這里大概翻譯是:一個在 Java VM 上使用可觀測的序列來組成異步的、基于事件的程序的庫。
???最近剛好碰到一個用了mvp+RxAndroid+RxJava的框架的項目,剛剛接觸對lambda簡直一臉懵逼。還因為只能跑在1.8版本的jdk,表示默默從1.7版本升級了~
常用標識符介紹:
(一)just與from
???使用場景:在有時候,我們發布的事件是多件,但是訂閱者只需要一個即可,那么我們要寫多個Observable嗎?答案是:不需要。這里RxJava提供了兩個操作符,分別為:just與from。兩者實現功能是等價的,都可以同時初始化多個Observable,并且發布到同一個訂閱者。具體實現方式如下:
Observable.just("1", "2", "3").subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i(TAG, s);
}
});
String[] datas = {"4", "5", "6"};//等價于 jsut(...)
Observable.from(datas).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.i(TAG, s);
}
});
(二)強大的變換 map
???使用場景,當我們發布一個事件的時候,例如發布的時候自帶了一個網絡圖片鏈接,我們不希望在訂閱者處理事件的時候,還要跑將url轉化為Bitmap的邏輯(因為這樣一定程度會消耗在主線程的事件,造成界面卡頓),因此我們希望有個機制可以幫我們將url轉化成Bitmap,這就是操作符map的操作功能,具體實現如下:
String imgUrl = "";
Observable.just(imgUrl)
.map(new Func1<String, Bitmap>() {
@Override
public Bitmap call(String s) {
Bitmap bitmap = ToolUtils.url2Bitmap(s);
return bitmap ;
}
})
.subscribe(new Action1<Bitmap>() {
@Override
public void call(Bitmap bitmap) {
imagview.setImageBitmap(bitmap);
}
});
(3)強大的變換flatMap
???使用場景:在上面案例中Map只能做一對一的轉化。假如有一個場景,在一個學生對象中,擁有屬性課程,并且一個學生可以擁有多個課程信息。這里如果用map將學生轉化為課程信息,明顯這種一對多的場景map實用不了,因此我們也希望有個新的機制可以對一對多場景進行轉化,具體實現如下:
List<Student> datas = new ArrayList<>();
for (int i = 0; i < 10; i++) {
String cuoursName = Integer.toString(i) + "同學課程";
String[] cours = {cuoursName, cuoursName, cuoursName, cuoursName, cuoursName, cuoursName, cuoursName, cuoursName, cuoursName};
Student student = new Student(Integer.toString(i) + "同學", cours);
datas.add(student);
}
Subscriber<String> mSubscriber = new Subscriber<String>() {
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(String s) {
Log.i(TAG, s);
}
};
Observable.from(datas).flatMap(new Func1<Student, Observable<String>>() {
@Override
public Observable<String> call(Student student) {
Log.i(TAG, student.getName());
return Observable.from(student.getCours());
}
}).subscribe(mSubscriber);
???讀者閱讀到這里,也許會覺得flatMap比較難理解,筆者第一次接觸的時候也相對覺得的確不好理解,如果你按照遞歸的方式去思考這個操作符,flatMap與map唯一的去吧,就是回調call的時候還是返回了一個發布者Observable,因此在訂閱者接收的時候,其實是多次性被觸發了。
最后
???技術迭代非常快,除了天天忙碌的工作,也要擠點時間積累積累。溫習舊知識,學習新技術!共勉!
傻小孩b
共勉,寫給在成長路上奮斗的你