鍍金池/ 教程/ Android/ 介紹
調(diào)度器 Scheduler
Empty/Never/Throw
Replay
這個頁面展示了創(chuàng)建Observable的各種方法。
ObserveOn
ReactiveX
TimeInterval
Window
本頁展示的操作符用于對整個序列執(zhí)行算法操作或其它操作,由于這些操作必須等待數(shù)據(jù)發(fā)射完成(通常也必須緩存這些數(shù)據(jù)),它們對于非常長
IgnoreElements
Distinct
Last
Start
And/Then/When
Switch
創(chuàng)建操作
Materialize/Dematerialize
CombineLatest
Catch
實現(xiàn)自己的操作符
StringObservable
Map
ConnectableObservable
Using
Take
BlockingObservable
TakeLast
Defer
RxJavaSchedulersHook
First
FlatMap
這個頁面的操作符可用于根據(jù)條件發(fā)射或變換Observables,或者對它們做布爾運算:
Do
Repeat
Serialize
這個頁面展示的操作符可用于過濾和選擇Observable發(fā)射的數(shù)據(jù)序列。
這個頁面列出了很多用于Observable的輔助操作符
Single
Retry
從錯誤中恢復(fù)的技術(shù)
Sample
Merge
算術(shù)和聚合操作
Range
Timestamp
RxJava Issues
From
Subscribe
Subject
Delay
Skip
SubscribeOn
Filter
按字母順序排列的全部操作符列表
Timeout
Scan
onError
Zip
RxJava文檔和教程
Publish
ElementAt
第一個例子
SkipLast
Just
Timer
Debounce
GroupBy
條件和布爾操作
這個頁面展示了可用于對Observable發(fā)射的數(shù)據(jù)執(zhí)行變換操作的各種操作符。
Introduction
rxjava-async
介紹響應(yīng)式編程
這個頁面展示的操作符可用于組合多個Observables。
ReactiveX
Connect
操作符分類
StartWith
Interval
Join
To
Buffer
RefCount
介紹
Observable

介紹

rxjava-android 模塊包含RxJava的Android特定的綁定代碼。它給RxJava添加了一些類,用于幫助在Android應(yīng)用中編寫響應(yīng)式(reactive)的組件。

  • 它提供了一個可以在給定的Android Handler 上調(diào)度 Observable 的調(diào)度器 Scheduler,特別是在UI主線程上。
  • 它提供了一些操作符,讓你可以更容易的處理 FragmentActivity 的生命周期方法。
  • 它提供了很多Android消息和通知組件的包裝類,用于與Rx的調(diào)用鏈搭配使用。
  • 針對常見的Android用例和重要的UI,它提供了可復(fù)用的、自包含的響應(yīng)式組件。(即將到來

Binaries

你可以在 http://search.maven.org 找到用于Maven, Ivy, Gradle和其它構(gòu)建系統(tǒng)的二進制文件和依賴信息。

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" />

當前支持的最低API版本(minSdkVersion)是 10 (Android 2.3/Gingerbread)

示例

在UI線程觀察(Observing)

在Android上,通常處理異步任務(wù)時你會在主線程上等待(observing)處理結(jié)果,一般情況下你使用 AsyncTask 達到這個目的。使用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ā)射。

在任意線程觀察(Observing)

前面的例子是一個普遍概念的特殊版本: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é)果通過 onNextcustom-thread-1 線程上發(fā)射。(這個例子不太自然,因為你可以調(diào)用observeOn(Schedulers.currentThread()),但是它說清楚了這個想法。)

Fragment和Activity生命周期

在Android上,要在異步操作中訪問框架中的對象有些棘手,那是因為Andoid系統(tǒng)可以決定銷毀(destroy)一個 Activity,例如,當一個后臺線程還在運行的時候,如果這個線程嘗試訪問一個已經(jīng)死掉的Activity中的View對象,會導(dǎo)致異常退出(Crash)。(這也會導(dǎo)致內(nèi)存泄露,因為 Activity 已經(jīng)不可見了,你的后臺線程還持有它的引用。)

這仍然是在Android上使用RxJava需要關(guān)注的一個問題,但是通過使用 Subscription和其它Observable操作符,你可以優(yōu)雅地解決這個問題。通常來說,當你在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會再次啟動。你可以使用 cachereplay 操作符阻止它發(fā)生,這些操作符保證Observable在 Activity 的生命周期內(nèi)存在(你可以在一個全局的緩存中保存它,比如放在Fragment中。)你可以使用任何操作符,只要能保證:當訂閱者訂閱一個已經(jīng)在運行的Observable時,在它與Activity 解除關(guān)聯(lián)的這段時間里發(fā)射的數(shù)據(jù)都會被回放,并且來自這個Observable的任何離線通知都會正常分發(fā)。

參考資料

上一篇:Retry下一篇:SkipLast