Android網(wǎng)絡(luò)篇(三)—— RxJava的基本使用

關(guān)于RxJava,其實(shí)大家都應(yīng)該很熟悉了。最早了解RxJava的時(shí)候,是看的拋物線大神的關(guān)于RxJava的講解,不過(guò)那個(gè)時(shí)候是基于RxJava 1.0的版本做的講解,如今,RxJava已經(jīng)更新到3.0了,所以自己再回頭學(xué)習(xí)學(xué)習(xí)。

定義:

是一個(gè)在Java虛擬機(jī)上,使用可觀察的序列構(gòu)成基于事件的,異步的程序庫(kù)。

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

(1)簡(jiǎn)潔,通過(guò)鏈?zhǔn)降姆绞饺ヌ幚碚?qǐng)求,代碼易懂而且非常有條理性。
(2)是一種響應(yīng)式編程,可以很好的處理各種多變需求且不會(huì)影響到代碼的擴(kuò)展性和維護(hù)性。

響應(yīng)式編程:

響應(yīng)式編程是一種基于異步數(shù)據(jù)流概念的編程模式。數(shù)據(jù)流就像一條河:它可以被觀測(cè),被過(guò)濾,被操作,或者為新的消費(fèi)者與另外一條流合并為一條新的流。響應(yīng)式編程的一個(gè)關(guān)鍵概念是事件。事件可以被等待,可以觸發(fā)過(guò)程,也可以觸發(fā)其它事件。事件是唯一的以合適的方式將我們的現(xiàn)實(shí)世界映射到我們的軟件中。

RxJava的基本使用:

** 第一步:初始化 Observable **
** 第二步:初始化 Observer **
** 第三步:建立訂閱關(guān)系 **

 // 1.創(chuàng)建觀察者(Observer)
val observer = object : Observer<String> {

    // 當(dāng)觀察者被訂閱時(shí)回調(diào)
    override fun onSubscribe(d: Disposable?) {
        Log.i(TAG, "onSubscribe")
    }

    // 當(dāng)觀察者收到onNext事件時(shí)回調(diào)
    override fun onNext(t: String?) {
        Log.i(TAG, "onNext-->$t")
    }

    // 當(dāng)觀察者收到onError事件時(shí)回調(diào)
    override fun onError(e: Throwable?) {
        Log.i(TAG, "onError")
    }

    // 當(dāng)觀察者收到onComplete事件時(shí)回調(diào)
    override fun onComplete() {
        Log.i(TAG, "onComplete")
    }
}

// 2.創(chuàng)建被觀察者(Observable)
val observable = Observable.create(ObservableOnSubscribe<String> { emitter ->
    emitter?.onNext("1")
    emitter?.onNext("2")
    emitter?.onNext("3")
    emitter?.onNext("4")
    emitter?.onComplete()
})
// 3.訂閱
observable.subscribe(observer)

當(dāng)然我們也可以使用鏈?zhǔn)酵瓿缮厦娴墓δ?/p>

//     使用鏈?zhǔn)秸{(diào)用完成上面的功能
Observable.create(ObservableOnSubscribe<String> { emitter ->
    emitter?.onNext("1")
    emitter?.onNext("2")
    emitter?.onNext("3")
    emitter?.onNext("4")
    emitter?.onComplete()
}).subscribe(object : Observer<String> {
    override fun onSubscribe(d: Disposable?) {
        Log.i(TAG, "onSubscribe")
    }

    override fun onNext(t: String?) {
        Log.i(TAG, "onNext-->$t")
    }

    override fun onError(e: Throwable?) {
        Log.i(TAG, "onError")
    }

    override fun onComplete() {
        Log.i(TAG, "onComplete")
    }
})

需要說(shuō)明的是:
被觀察者中有個(gè)Emitter(發(fā)射器),發(fā)射器的位置位于subscribe回調(diào)參數(shù)ObservableEmitter e中,RxJava的事件通知就是通過(guò)它來(lái)進(jìn)行發(fā)送的,發(fā)射器能發(fā)送的事件有onNext(),onComplete(),onError(),在觀察者的回調(diào)中,分別對(duì)應(yīng)著相同方法名進(jìn)行回調(diào)。

onSubscribe():當(dāng)觀察者被訂閱時(shí)回調(diào)

onNext():當(dāng)觀察者收到onNext事件時(shí)回調(diào)

onComplete():當(dāng)觀察者收到onComplete事件時(shí)回調(diào)

onError():當(dāng)觀察者收到onError事件時(shí)回調(diào)

RxJava的線程調(diào)度

在RxJava中的線程調(diào)度是RxJava的一大核心亮點(diǎn)之一,因?yàn)镽xJava遵循的是事件在哪個(gè)線程產(chǎn)生,就在哪個(gè)線程消費(fèi),然而,在實(shí)際的開發(fā)過(guò)程中,很多的時(shí)候我們必須要進(jìn)行切換線程操作,比如,我們通常將耗時(shí)的操作放置在子線程,然后將View的顯示放置在UI線程,所以當(dāng)數(shù)據(jù)處理完畢后(讀取文件、請(qǐng)求網(wǎng)絡(luò)等等)我們需要切換線程,以往我們更多使用Handler來(lái)進(jìn)行處理,而如今我們可以使用RxJava來(lái)進(jìn)行處理,究其原因,在于RxJava進(jìn)行線程調(diào)度的時(shí)候非常方便,看下面這個(gè)例子:

 //創(chuàng)建被觀察者
    Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        //默認(rèn)在主線程里執(zhí)行該方法
        public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
            e.onNext("1");
            e.onNext("2");
            e.onNext("3");
            e.onNext("4");
            e.onComplete();
        }
    })
            //將被觀察者切換到子線程
            .subscribeOn(Schedulers.io())
            //將觀察者切換到主線程  需要在Android環(huán)境下運(yùn)行
            .observeOn(AndroidSchedulers.mainThread())
            //創(chuàng)建觀察者并訂閱
            .subscribe(new Observer<String>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(String s) {
                    System.out.println("onNext=" + s);
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

簡(jiǎn)單的兩句

//將被觀察者切換到子線程
subscribeOn(Schedulers.io())
//將觀察者切換到主線程 需要在Android環(huán)境下運(yùn)行
observeOn(AndroidSchedulers.mainThread())

就可以完美切換線程,使用它不香嗎?當(dāng)然,除了這兩種還有其他的方式,如下:

線程調(diào)度器

在RxJava中也內(nèi)置了多種線程選線供我們使用。這些內(nèi)置的Scheduler已經(jīng)足夠滿足我們開發(fā)的需求, 因此我們應(yīng)該使用內(nèi)置的這些選項(xiàng),,在RxJava內(nèi)部使用的是線程池來(lái)維護(hù)這些線程, 所以效率也比較高。

(1)Schedulers.io():代表io操作的線程, 通常用于網(wǎng)絡(luò),讀寫文件等io密集型的操作。
(2)Schedulers.computation(): 代表CPU計(jì)算密集型的操作, 例如需要大量計(jì)算的操作。
(3)Schedulers.newThread():代表一個(gè)常規(guī)的新線程。
(4)AndroidSchedulers.mainThread():代表Android的主線程。

RxJava常用操作符

在RxJava中,操作符也是非常重要的一個(gè)環(huán)節(jié),熟練掌握并使用好操作符可以達(dá)到事半功倍的效果,而關(guān)于操作符的使用,可以看看這篇博客,博主寫的非常完善,為這么厲害的博主點(diǎn)個(gè)贊,具體的鏈接為:

<u>https://blog.csdn.net/weixin_42046829/article/details/104836592</u>

結(jié)語(yǔ):現(xiàn)在在項(xiàng)目中RxJava已經(jīng)成為了標(biāo)配,而在此基礎(chǔ)上還產(chǎn)生了諸如RxAndroid,RxBus等等優(yōu)秀的框架,作為響應(yīng)式編程的組件,用好它可以給我們的開發(fā)帶來(lái)非常棒的體驗(yàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容