目錄
一价匠、Is what 是什么
二当纱、Concept 概念
三、Basic realization 基本實(shí)現(xiàn)
四踩窖、Scheduler 線(xiàn)程控制(上)
五坡氯、Scheduler 線(xiàn)程控制(下)
六、變換
因個(gè)人學(xué)習(xí)需要毙石,故文章內(nèi)容均為網(wǎng)上摘抄整理廉沮,感謝創(chuàng)作者的辛勤,源文章地址請(qǐng)看文末徐矩。
RxJava是什么
簡(jiǎn)言:一個(gè)實(shí)現(xiàn)異步操作的庫(kù)
GitHub : "RxJava is a Java VM implementation of
Reactive Extensions
: a library for composing asynchronous and event-based programs by using observable sequences."
(一個(gè)在 Java VM 上使用可觀(guān)測(cè)的序列來(lái)組成異步的滞时、基于事件的程序的庫(kù))。
RxJava的好處
簡(jiǎn)言:簡(jiǎn)潔
AsyncTask
滤灯、Handler
:為了異步代碼更加簡(jiǎn)潔坪稽;
RxJava
:即使程序邏輯復(fù)雜,依然能夠保持簡(jiǎn)潔鳞骤。
栗子:
顯示多張圖片≈习伲現(xiàn)有目錄數(shù)組 File[] folders
, 將目錄下的 png
圖片全部加載,通過(guò) addImage(Bitmap)
方法顯示豫尽。
注意篙梢,由于讀取圖片屬耗時(shí)操作,需放在后臺(tái)執(zhí)行美旧,圖片的顯示必須在 UI
線(xiàn)程執(zhí)行渤滞。
普通實(shí)現(xiàn)方式:
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
贬墩,實(shí)現(xiàn)方式如下:
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);
}
});
由此可見(jiàn),簡(jiǎn)潔并非單純的代碼量減少妄呕,而是邏輯的簡(jiǎn)潔陶舞。該實(shí)現(xiàn),是一條從上到下的鏈?zhǔn)秸{(diào)用绪励,沒(méi)有任何嵌套肿孵,這在處理復(fù)雜的需求時(shí),優(yōu)勢(shì)尤為明顯疏魏。