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

介紹

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

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

Binaries

你可以在 http://search.maven.org 找到用于Maven, Ivy, Gradle和其它構建系統的二進(jìn)制文件和依賴(lài)信息。

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線(xiàn)程觀(guān)察(Observing)

在A(yíng)ndroid上,通常處理異步任務(wù)時(shí)你會(huì )在主線(xiàn)程上等待(observing)處理結果,一般情況下你使用 AsyncTask 達到這個(gè)目的。使用RxJava,你會(huì )使用 observeOn 操作符聲明你要在主線(xiàn)程等待 Observable 的結果:

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 */);
}

這個(gè)例子中,Observable在一個(gè)新的線(xiàn)程執行,結果通過(guò) onNext 在主線(xiàn)程發(fā)射。

在任意線(xiàn)程觀(guān)察(Observing)

前面的例子是一個(gè)普遍概念的特殊版本:Android使用一個(gè)叫 Handler 的類(lèi)綁定異步通信到消息循環(huán)。為了在任意線(xiàn)程 觀(guān)察 一個(gè)Observable,需要創(chuàng )建一個(gè)與那個(gè)類(lèi)關(guān)聯(lián)的 Handler,然后使用 AndroidSchedulers.handlerThread 調度器:

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();

這個(gè)例子中,Observable在一個(gè)新的線(xiàn)程執行,結果通過(guò) onNextcustom-thread-1 線(xiàn)程上發(fā)射。(這個(gè)例子不太自然,因為你可以調用observeOn(Schedulers.currentThread()),但是它說(shuō)清楚了這個(gè)想法。)

Fragment和Activity生命周期

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

這仍然是在A(yíng)ndroid上使用RxJava需要關(guān)注的一個(gè)問(wèn)題,但是通過(guò)使用 Subscription和其它Observable操作符,你可以?xún)?yōu)雅地解決這個(gè)問(wèn)題。通常來(lái)說(shuō),當你在Activity中訂閱一個(gè)Observable的結果時(shí)(無(wú)論是直接的還是通過(guò)一個(gè)內部類(lèi)),你必須在 onDestroy 里取消訂閱,就像下面例子里展示的那樣:

// MyActivity
private Subscription subscription;

protected void onCreate(Bundle savedInstanceState) {
    this.subscription = observable.subscribe(this);
}

...

protected void onDestroy() {
    this.subscription.unsubscribe();
    super.onDestroy();
}

這樣確保所有指向訂閱者(這個(gè)Activity)的引用盡快釋放,不會(huì )再有通知通過(guò) onNext 發(fā)射給這個(gè)訂閱者。

有一個(gè)問(wèn)題,如果由于屏幕方向的變化導致這個(gè) Activity 被銷(xiāo)毀,在 onCreate 中這個(gè)Observable會(huì )再次啟動(dòng)。你可以使用 cachereplay 操作符阻止它發(fā)生,這些操作符保證Observable在 Activity 的生命周期內存在(你可以在一個(gè)全局的緩存中保存它,比如放在Fragment中。)你可以使用任何操作符,只要能保證:當訂閱者訂閱一個(gè)已經(jīng)在運行的Observable時(shí),在它與Activity 解除關(guān)聯(lián)的這段時(shí)間里發(fā)射的數據都會(huì )被回放,并且來(lái)自這個(gè)Observable的任何離線(xiàn)通知都會(huì )正常分發(fā)。

參考資料

上一篇:Retry下一篇:SkipLast