rxjava-android
模塊包含RxJava的Android特定的綁定代碼。它給RxJava添加了一些類,用于幫助在Android應(yīng)用中編寫響應(yīng)式(reactive
)的組件。
Handler
上調(diào)度 Observable
的調(diào)度器 Scheduler
,特別是在UI主線程上。Fragment
和 Activity
的生命周期方法。你可以在 http://search.maven.org 找到用于Maven, Ivy, Gradle和其它構(gòu)建系統(tǒng)的二進(jìn)制文件和依賴信息。
Maven 示例:
<dependency>
<groupId>io.reactivex</groupId>
<artifactId>rxandroid</artifactId>
<version>0.23.0</version>
</dependency>
Ivy 示例:
<dependency org="io.reactivex" name="rxandroid" rev="0.23.0" />
當(dāng)前支持的最低API版本(minSdkVersion
)是 10
(Android 2.3/Gingerbread)
在Android上,通常處理異步任務(wù)時你會在主線程上等待(observing)處理結(jié)果,一般情況下你使用 AsyncTask
達(dá)到這個目的。使用RxJava,你會使用 observeOn
操作符聲明你要在主線程等待 Observable
的結(jié)果:
public class ReactiveFragment extends Fragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Observable.from("one", "two", "three", "four", "five")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(/* an Observer */);
}
這個例子中,Observable在一個新的線程執(zhí)行,結(jié)果通過 onNext
在主線程發(fā)射。
前面的例子是一個普遍概念的特殊版本:Android使用一個叫 Handler
的類綁定異步通信到消息循環(huán)。為了在任意線程 觀察
一個Observable,需要創(chuàng)建一個與那個類關(guān)聯(lián)的 Handler
,然后使用 AndroidSchedulers.handlerThread
調(diào)度器:
new Thread(new Runnable() {
@Override
public void run() {
final Handler handler = new Handler(); // bound to this thread
Observable.from("one", "two", "three", "four", "five")
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.handlerThread(handler))
.subscribe(/* an Observer */)
// perform work, ...
}
}, "custom-thread-1").start();
這個例子中,Observable在一個新的線程執(zhí)行,結(jié)果通過 onNext
在 custom-thread-1
線程上發(fā)射。(這個例子不太自然,因為你可以調(diào)用observeOn(Schedulers.currentThread())
,但是它說清楚了這個想法。)
在Android上,要在異步操作中訪問框架中的對象有些棘手,那是因為Andoid系統(tǒng)可以決定銷毀(destroy
)一個 Activity
,例如,當(dāng)一個后臺線程還在運(yùn)行的時候,如果這個線程嘗試訪問一個已經(jīng)死掉的Activity
中的View對象,會導(dǎo)致異常退出(Crash)。(這也會導(dǎo)致內(nèi)存泄露,因為 Activity
已經(jīng)不可見了,你的后臺線程還持有它的引用。)
這仍然是在Android上使用RxJava需要關(guān)注的一個問題,但是通過使用 Subscription
和其它Observable操作符,你可以優(yōu)雅地解決這個問題。通常來說,當(dāng)你在Activity
中訂閱一個Observable
的結(jié)果時(無論是直接的還是通過一個內(nèi)部類),你必須在 onDestroy
里取消訂閱,就像下面例子里展示的那樣:
// MyActivity
private Subscription subscription;
protected void onCreate(Bundle savedInstanceState) {
this.subscription = observable.subscribe(this);
}
...
protected void onDestroy() {
this.subscription.unsubscribe();
super.onDestroy();
}
這樣確保所有指向訂閱者(這個Activity
)的引用盡快釋放,不會再有通知通過 onNext
發(fā)射給這個訂閱者。
有一個問題,如果由于屏幕方向的變化導(dǎo)致這個 Activity
被銷毀,在 onCreate
中這個Observable會再次啟動。你可以使用 cache
或 replay
操作符阻止它發(fā)生,這些操作符保證Observable在 Activity
的生命周期內(nèi)存在(你可以在一個全局的緩存中保存它,比如放在Fragment中。)你可以使用任何操作符,只要能保證:當(dāng)訂閱者訂閱一個已經(jīng)在運(yùn)行的Observable時,在它與Activity
解除關(guān)聯(lián)的這段時間里發(fā)射的數(shù)據(jù)都會被回放
,并且來自這個Observable的任何離線通知都會正常分發(fā)。