1. 程式人生 > >從零開始的RxJava2.0教程(四)在安卓中的應用

從零開始的RxJava2.0教程(四)在安卓中的應用

1. 前言

2. RxAndroid

RxAndroid是RxJava針對Android平臺的擴充套件庫。

曾幾何時,RxAndroid確實提供了很多的實用的方法,但後來社群上很多人對這庫的結構有意見,然後作者便進行了重構,現在只保留了AndroidSchedulers, 現在基本RxAndroid只有一個功能,那就是AndroidSchedulers.mainThread 方法用於指定主執行緒。

以前那些類被劃分到了其他一些Rx庫,比如 RxBinding, RxLifecycle。這裡我並不打算介紹,因為對於新手來說,為時太早,如果你有興趣,可以自己查閱相關資料。

3. 配合 Retrofit 2

目前來說,Android的網路庫基本被 Retrofit + OkHttp 一統天下了。因為它確實很優秀。

當然,RxJava的影響力也不容小覷,Retrofit 也提供了對RxJava 的支援,截止到目前(2016.11.06)為止,官方似乎還沒有支援RxJava 2.0。不過你不用擔心,已經有大神幫我們做好了。

要使用 Retrofit 需要引入對應的庫。

compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.10.0'
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

retrofit2 依賴於 okhttp3,而 okhttp3 又依賴於okio。最後一項便是大神寫好的 retrofit2-rxjava2-adapter 介面卡啦。

假設我們現在需要去獲取百度頁面的html程式碼。

public interface BaiDuService {
    @GET("/")
    Flowable<ResponseBody> getText();
}

定義好請求介面。注意,返回值是 Flowable 型別。

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://www.baidu.com/")
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())// 新增RxJava2的介面卡支援
        .build();
BaiDuService service = retrofit.create(BaiDuService.class);
service.getText()
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Subscriber<ResponseBody>() {
            @Override
            public void onSubscribe(Subscription s) {
                s.request(Long.MAX_VALUE);
            }

            @Override
            public void onNext(ResponseBody s) {
                Toast.makeText(RxJava2Activity.this, "獲取成功", Toast.LENGTH_SHORT).show();
                try {
                    System.out.println(s.string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onError(Throwable t) {
                t.printStackTrace();
                Toast.makeText(RxJava2Activity.this, "獲取失敗,請檢查網路是否暢通", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onComplete() {
                System.out.println("任務結束");
            }
        });

在建立 Retrofit 的時候新增對 RxJava 2 的介面卡,這樣,請求就可以直接返回 Flowable。 然後就可以進行 RxJava 2 的操作了。

4. 從RxJava 2中獲取資料

前面我介紹了可以通過 fromX 的方法把陣列、列表等資料發射出去。那麼有沒有辦法直接把發射的資料獲取出來而不是通過訂閱者來輸出呢?

List<String> ids = Flowable.range(1, 100)
        .map(new Function<Integer, String>() {
            @Override
            public String apply(Integer integer) throws Exception {
                return "id:" + integer;
            }
        })
        .toList().blockingGet();
System.out.println(ids);

比如這裡,我發射了1到100總計100個數據,我們可以通過 blockingX 方法來拿到這些資料。

5. 結束

本系列教程到此結束,但我介紹的僅僅只是 RxJava 的冰山一角,如果你有更高的需求,請查閱其他資料。

感謝您的閱讀。