<a href="http://www.itdecent.cn/p/f4af4752cd26">RxJava 從入門到愛上它 - 源碼分析線程控制</a>
<a href="http://www.itdecent.cn/p/ffb6c25f472b">RxJava 從入門到愛上它 - "變換"的深入理解</a>
關于Backpressure 作者也將在后續(xù)的文章中做出解析。
RxJava
RxJava 是什么
官方的解釋是: RxJava是 ReactiveX 在JVM上的一個實現(xiàn),ReactiveX使用Observable序列組合異步和基于事件的程序。
Rx 是一個多語言實現(xiàn)
RxJava 支持Java 6或者更新的版本,以及其它的JVM語言如 Groovy, Clojure, JRuby, Kotlin 和 Scala。RxJava 可用于更多的語言環(huán)境,而不僅僅是Java和Scala,而且它致力于尊重每一種JVM語言的習慣。
為什么要使用 RxJava
- 函數(shù)式風格:對可觀察數(shù)據(jù)流使用無副作用的輸入輸出函數(shù),避免了程序里錯綜復雜的狀態(tài)
- 簡化代碼:Rx的操作符通通常可以將復雜的難題簡化為很少的幾行代碼
- 異步錯誤處理:傳統(tǒng)的try/catch沒辦法處理異步計算,Rx提供了合適的錯誤處理機制
- 輕松使用并發(fā):Rx的Observables和Schedulers讓開發(fā)者可以擺脫底層的線程同步和各種并發(fā)問題
傳統(tǒng)的調用方法 (此例子來自: https://gank.io/post/560e15be2dca930e00da1083#toc_32)
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();
此例子就是異步遍歷文件,如果是以png結尾的就轉換成位圖,然后在主線程中顯示。
如果我們換成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是很必要學習并使用的。
RxJava 怎么使用呢?
-
簡單的使用
Observable.just("hello", "my", "name", "is", "nichool") .subscribe(new Action1<String>() { @Override public void call(String s) { LogUtils.LogW(s); } });通過
just來創(chuàng)建一個被觀察者,被觀察者中決定將會做的事情,然后subscribe進行注冊觀察者。以下為在觀察者中將會打印的 :
RxJavaDemo: hello RxJavaDemo: my RxJavaDemo: name RxJavaDemo: is RxJavaDemo: nichool -
復雜的操作
Student[] students= new Student[]{ new Student("nichool", 100), new Student("li", 54), new Student("wang", 64), new Student("wu", 70), new Student("liu", 59), new Student("liu", 60), }; Observable.from(students).filter(new Func1<Student, Boolean>() { @Override public Boolean call(Student student) { return student.score >= 60; } }).map(new Func1<Student, String>() { @Override public String call(Student student) { return student.mName + " is a qualified student"; } }).subscribe(new Action1<String>() { @Override public void call(String s) { LogUtils.LogW(s); } });以上代碼為:在學生中查找及格的學生,并打印合格學生表。
RxJavaDemo: nichool is a qualified student RxJavaDemo: wang is a qualified student RxJavaDemo: wu is a qualified student RxJavaDemo: liu is a qualified student
如果想了解更多的操作符使用 請查看操作方法這篇文章
- 在Android上的配置與使用
在需要使用RxJava的對應模塊下的build.gradle 中添加這幾句 (如需使用其他的版本,請修改版本號)。使用RxAndroid時最好帶著RxJava,官方的解釋是RxAndroid的版本還很少,需要用RxJava來彌補它的不足。compile 'io.reactivex:rxandroid:1.2.1' // Because RxAndroid releases are few and far between, it is recommended you also // explicitly depend on RxJava's latest version for bug fixes and new features. compile 'io.reactivex:rxjava:1.1.6'
RxAndroid
解釋: rxjava-android 模塊包含RxJava的Android特定的綁定代碼。它給RxJava添加了一些類,用于幫助在Android應用中編寫響應式(reactive)的組件。
- 它提供了一個可以在給定的Android Handler 上調度 Observable 的調度器 Scheduler,特別是在UI主線程上 (
AndroidSchedulers.mainThread()、AndroidSchedulers.handlerThread(handler))。 - 它提供了一些操作符,讓你可以更容易的處理 Fragment 和 Activity 的生命周期方法。
// MyActivity private Subscription subscription; protected void onCreate(Bundle savedInstanceState) { this.subscription = observable.subscribe(this); } ... protected void onDestroy() { this.subscription.unsubscribe(); super.onDestroy(); } - 它提供了很多Android消息和通知組件的包裝類,用于與Rx的調用鏈搭配使用。
- 針對常見的Android用例和重要的UI,它提供了可復用的、自包含的響應式組件。(即將到來)
Android中使用 RxLifecycle 更好的保證及時的注冊與解除注冊。
.compose(this.<Long>bindToLifecycle()) //這個訂閱關系跟Activity綁定,Observable 和activity生命周期同步
RxLifecycle更多方法請自行百度
↓↓↓↓↓如果覺得可以的話,請點擊下面的喜歡?;蛘叽蛸p哦,我會更加努力的。↓↓↓↓↓