成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

【Android】RxJava的使用(一)基本用法

用戶83 / 3450人閱讀

摘要:第一篇只介紹了的基本用法,暫時(shí)還無(wú)法看出的優(yōu)勢(shì)。不僅把每個(gè)事件多帶帶處理,還會(huì)把它們看做一個(gè)隊(duì)列。在事件處理過(guò)程中出異常時(shí),會(huì)被觸發(fā),同時(shí)隊(duì)列自動(dòng)終止,不允許再有事件發(fā)出。可以使用或來(lái)創(chuàng)建一個(gè),并為它定義事件觸發(fā)規(guī)則。

前言

最近經(jīng)常看到RxJava這個(gè)字眼,也看到很多人在博客中推薦使用RxJava。好奇的我怎么能錯(cuò)過(guò),于是Google了一下,說(shuō)RxJava好用的和說(shuō)RxJava難用的都有,于是自己也親自嘗試了一下(感覺(jué)不容易上手)。寫(xiě)博客記錄下學(xué)習(xí)的過(guò)程,一方面作為鞏固,另一方面希望能幫助到初學(xué)者。
(第一篇只介紹了RxJava的基本用法,暫時(shí)還無(wú)法看出RxJava的優(yōu)勢(shì)。切莫著急,隨著慢慢深入就能體會(huì)到RxJava帶來(lái)的方便了)

參考:給 Android 開(kāi)發(fā)者的 RxJava 詳解
(本文部分內(nèi)容引用自該博客)
介紹

在GitHub主頁(yè)上的介紹:

a library for composing asynchronous and event-based programs using observable sequences for the Java VM

翻譯過(guò)來(lái)就是:

一個(gè)在 Java VM 上使用可觀測(cè)的序列來(lái)組成異步的、基于事件的程序的庫(kù)

對(duì)于新手們來(lái)說(shuō)這個(gè)太抽象了,我們(我也是新手)需要看到看到一個(gè)更加具體的解釋?zhuān)?jiǎn)單來(lái)說(shuō),它就是一個(gè)實(shí)現(xiàn)異步操作的庫(kù)。(還是不懂?看代碼更實(shí)在)

優(yōu)點(diǎn)

RxJava的好處就在于它的簡(jiǎn)潔性,邏輯簡(jiǎn)單的時(shí)候看不出RxJava的優(yōu)勢(shì),想必大家都知道在調(diào)度過(guò)程比較復(fù)雜的情況下,異步代碼經(jīng)常會(huì)既難寫(xiě)也難被讀懂。這時(shí)候RxJava的優(yōu)勢(shì)就來(lái)了,隨著程序邏輯變得越來(lái)越復(fù)雜,它依然能夠保持簡(jiǎn)潔。

觀察者模式

首先要先介紹一下觀察者模式(可能比喻的不夠恰當(dāng),意思到了就好);

觀察者:監(jiān)視著被觀察者的行為,當(dāng)被觀察者某個(gè)狀態(tài)改變的時(shí)候會(huì)通知觀察者,觀察者會(huì)執(zhí)行對(duì)應(yīng)的操作;

被觀察者:被監(jiān)視的對(duì)象,當(dāng)某個(gè)狀態(tài)改變的時(shí)候會(huì)通知觀察者;

訂閱(或注冊(cè)):將觀察者被觀察者建立聯(lián)系。

(很亂?來(lái)個(gè)栗子?)

這里舉一個(gè)我個(gè)常用的例子,點(diǎn)擊Button后觸發(fā)OnClickListener
中的onClick()事件。在這個(gè)事件中他們的角色分別如下:

觀察者:OnClickListener;

被觀察者:Button;

訂閱(或注冊(cè)):setOnClickListener()。

RxJava

在上面介紹了觀察者模式,這里也將RxJava中的三個(gè)角色進(jìn)行一下角色分配

觀察者:Observer;

被觀察者:Observable;

訂閱(或注冊(cè)):subscribe()。

觀察者

Observer 即觀察者,它決定事件觸發(fā)的時(shí)候?qū)⒂性鯓拥男袨椤?br>RxJava 觀察者的事件回調(diào)方法除了普通事件onNext()(相當(dāng)于onClick()/onEvent())之外,還定義了兩個(gè)特殊的事件:onCompleted()和onError()。


onCompleted(): 事件隊(duì)列完結(jié)。RxJava 不僅把每個(gè)事件多帶帶處理,還會(huì)把它們看做一個(gè)隊(duì)列。RxJava 規(guī)定,當(dāng)不會(huì)再有新的onNext()發(fā)出時(shí),需要觸發(fā)onCompleted()方法作為標(biāo)志。

onError(): 事件隊(duì)列異常。在事件處理過(guò)程中出異常時(shí),onError()

會(huì)被觸發(fā),同時(shí)隊(duì)列自動(dòng)終止,不允許再有事件發(fā)出。

在一個(gè)正確運(yùn)行的事件序列中,onCompleted()和onError()有且只有一個(gè),并且是事件序列中的最后一個(gè)。需要注意的是,onCompleted()

和onError()二者也是互斥的,即在隊(duì)列中調(diào)用了其中一個(gè),就不應(yīng)該再調(diào)用另一個(gè)。

被觀察者

Observable 即被觀察者,它決定什么時(shí)候觸發(fā)事件以及觸發(fā)怎樣的事件??梢允褂胏reate()、just(T...)、from(T[])或from(Iterable)來(lái)創(chuàng)建一個(gè) Observable ,并為它定義事件觸發(fā)規(guī)則。

訂閱

創(chuàng)建了Observable和Observer之后,再用subscribe()方法將它們聯(lián)結(jié)起來(lái)

直接看代碼吧,這里只展示了RxJava的基本用法,暫時(shí)看不出RxJava的優(yōu)勢(shì)。

使用

例:打印機(jī)個(gè)字符串
添加依賴

compile "io.reactivex:rxjava:1.0.14"
compile "io.reactivex:rxandroid:1.0.1"
        //創(chuàng)建一個(gè)觀察者
        Observer observer = new Observer() {

            @Override
            public void onCompleted() {
                Log.i(TAG, "Completed");
            }

            @Override
            public void onError(Throwable e) {
                Log.i(TAG, "Error");
            }

            @Override
            public void onNext(String s) {
                Log.i(TAG, s);
            }
        };
        //使用Observable.create()創(chuàng)建被觀察者
        Observable observable1 = Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber subscriber) {
                subscriber.onNext("Hello");
                subscriber.onNext("Wrold");
                subscriber.onCompleted();
            }
        });
        //訂閱
        observable1.subscribe(observer);
以上用到的都是rx包里面的,別用錯(cuò)了!?。?br>

上面完成了一次Rxjava的基本使用。

擴(kuò)展

Subscriber

除了Observer接口之外,RxJava 還內(nèi)置了一個(gè)實(shí)現(xiàn)了Observer的抽象:Subscriber。Subscriber對(duì)Observer接口進(jìn)行了一些擴(kuò)展,但他們的基本使用方式是完全一樣的:

Subscriber subscriber = new Subscriber() {
    @Override
    public void onNext(String s) {
        Log.d(tag, "Item: " + s);
    }

    @Override
    public void onCompleted() {
        Log.d(tag, "Completed!");
    }

    @Override
    public void onError(Throwable e) {
        Log.d(tag, "Error!");
    }
};

不僅基本使用方式一樣,實(shí)質(zhì)上,在 RxJava 的 subscribe 過(guò)程中,Observer也總是會(huì)先被轉(zhuǎn)換成一個(gè)Subscriber再使用。如圖:

所以如果你只想使用基本功能,選擇Observer和Subscriber是完全一樣的。它們的區(qū)別對(duì)于使用者來(lái)說(shuō)主要有兩點(diǎn):


onStart(): 這是Subscriber增加的方法。它會(huì)在 subscribe 剛開(kāi)始,而事件還未發(fā)送之前被調(diào)用,可以用于做一些準(zhǔn)備工作,例如數(shù)據(jù)的清零或重置。這是一個(gè)可選方法,默認(rèn)情況下它的實(shí)現(xiàn)為空。需要注意的是,如果對(duì)準(zhǔn)備工作的線程有要求(例如彈出一個(gè)顯示進(jìn)度的對(duì)話框,這必須在主線程執(zhí)行),onStart()就不適用了,因?yàn)樗偸窃?subscribe 所發(fā)生的線程被調(diào)用,而不能指定線程。要在指定的線程來(lái)做準(zhǔn)備工作,可以使用doOnSubscribe()方法,具體可以在后面的文中看到。

unsubscribe(): 這是Subscriber所實(shí)現(xiàn)的另一個(gè)接口Subscription

的方法,用于取消訂閱。在這個(gè)方法被調(diào)用后,Subscriber將不再接收事件。一般在這個(gè)方法調(diào)用前,可以使用isUnsubscribed()先判斷一下?tīng)顟B(tài)。unsubscribe()這個(gè)方法很重要,因?yàn)樵趕ubscribe()之后,Observable會(huì)持有Subscriber的引用,這個(gè)引用如果不能及時(shí)被釋放,將有內(nèi)存泄露的風(fēng)險(xiǎn)。所以最好保持一個(gè)原則:要在不再使用的時(shí)候盡快在合適的地方(例如onPause()onStop()等方法中)調(diào)用unsubscribe()來(lái)解除引用關(guān)系,以避免內(nèi)存泄露的發(fā)生。

Observable

Observable的其他幾種創(chuàng)建方法,一下Observable等價(jià)于之前使用Create()創(chuàng)建的Observable:
1、使用Observable.just()創(chuàng)建被觀察者

Observable observable2 = Observable.just("Hello", "World");

2、使用Observable.from()創(chuàng)建被觀察者

String [] words = {"Hello", "World"};
Observable observable3 = Observable.from(words);

List list = new ArrayList();
list.add("Hellow");
list.add("Wrold");
Observable observable4 = Observable.from(list);
小結(jié)

目前沒(méi)看出RxJava的任何好處,感覺(jué)代碼還多了~~~
(別急,因?yàn)槭堑谝黄?,我只介紹了他們之間的關(guān)系以及最基礎(chǔ)的用法。后面的幾篇我會(huì)介紹RxJava的其他功能,還有一些復(fù)雜的嵌套關(guān)系的處理,到時(shí)候知道RxJava的強(qiáng)大之處了)

更多:
Android RxJava的使用(二)Action
Android RxJava的使用(三)轉(zhuǎn)換(map、flatMap)
Android RxJava的使用(四)線程控制 —— Scheduler

以上有錯(cuò)誤之處感謝指出

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73384.html

相關(guān)文章

  • AndroidRxJava使用(三)轉(zhuǎn)換——map、flatMap

    摘要:前兩篇的使用一基本用法的使用二介紹了的基本用法,對(duì)還不了解的請(qǐng)先看以上兩篇。這篇為大家講解中和的使用。注意對(duì)這些發(fā)射的數(shù)據(jù)做的是合并操作,因此它們可能是交錯(cuò)的。如果要保證順的的話,可以使用。其他操作符除了和之外,還有其他操作符以供使用。 前兩篇Android RxJava的使用(一)基本用法、Android RxJava的使用(二)Action介紹了RxJava的基本用法,對(duì)Rxjav...

    caozhijian 評(píng)論0 收藏0
  • AndroidRxJava使用(二)Action

    摘要:回顧在上一節(jié)的使用一基本用法中,介紹了的基本用法。它同樣只有一個(gè)方法,這個(gè)方法也無(wú)返回值,但有一個(gè)參數(shù)與同理,由于和也是單參數(shù)無(wú)返回值的,因此可以將和打包起來(lái)傳入以實(shí)現(xiàn)不完整定義的回調(diào)的使用定義三個(gè)對(duì)象,分別打包。 回顧 在上一節(jié)Android RxJava的使用(一)基本用法中,介紹了RxJava的基本用法。下面來(lái)回顧下實(shí)現(xiàn)一次RxJava的基本使用。例:分別打印Hello、 Wor...

    jemygraw 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<