成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

【Android】RxJava的使用(四)線程控制 —— Scheduler

clasnake / 392人閱讀

摘要:指定所發(fā)生的線程,即被激活時(shí)所處的線程。它指定的操作將在主線程運(yùn)行。也就是說,的處理和最后的消費(fèi)事件都會(huì)在線程中執(zhí)行。

前言

經(jīng)過前幾篇的介紹,對(duì)RxJava對(duì)模式有了一定的理解:由Observable發(fā)起事件,經(jīng)過中間的處理后由Observer消費(fèi)。(對(duì)RxJava還不了解的可以出門左拐)
之前的代碼中,事件的發(fā)起和消費(fèi)都是在同一個(gè)線程中執(zhí)行,也就是說之前我們使用的RxJava是同步的~~~
觀察者模式本身的目的不就是后臺(tái)處理,將處理結(jié)果回調(diào)給前臺(tái)?這同步的是要哪樣?所以,這篇為大家介紹RxJava的重要的概念——Scheduler

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

RxJava在不指定線程的情況下,發(fā)起時(shí)間和消費(fèi)時(shí)間默認(rèn)使用當(dāng)前線程。所以之前的做法

        Observable.just(student1, student2, student2)
                //使用map進(jìn)行轉(zhuǎn)換,參數(shù)1:轉(zhuǎn)換前的類型,參數(shù)2:轉(zhuǎn)換后的類型
                .map(new Func1() {
                    @Override
                    public String call(Student i) {
                        String name = i.getName();//獲取Student對(duì)象中的name
                        return name;//返回name
                    }
                })
                .subscribe(new Action1() {
                    @Override
                    public void call(String s) {
                        nameList.add(s);
                    }
                });

因?yàn)槭窃谥骶€程中發(fā)起的,所以不管中間map的處理還是Action1的執(zhí)行都是在主線程中進(jìn)行的。若是map中有耗時(shí)的操作,這樣會(huì)導(dǎo)致主線程擁塞,這并不是我們想看到的。

Scheduler

Scheduler:線程控制器,可以指定每一段代碼在什么樣的線程中執(zhí)行。
模擬一個(gè)需求:新的線程發(fā)起事件,在主線程中消費(fèi)

    private void rxJavaTest3() {
        Observable.just("Hello", "Word")
                .subscribeOn(Schedulers.newThread())//指定 subscribe() 發(fā)生在新的線程
                .observeOn(AndroidSchedulers.mainThread())// 指定 Subscriber 的回調(diào)發(fā)生在主線程
                .subscribe(new Action1() {
                    @Override
                    public void call(String s) {
                        Log.i(TAG, s);
                    }
                });

上面用到了subscribeOn(),和observeOn()方法來指定發(fā)生的線程和消費(fèi)的線程。

subscribeOn():指定subscribe()?所發(fā)生的線程,即?Observable.OnSubscribe?被激活時(shí)所處的線程?;蛘呓凶鍪录a(chǎn)生的線程。

observeOn():指定Subscriber?所運(yùn)行在的線程?;蛘呓凶鍪录M(fèi)的線程。

以及參數(shù)Scheduler,RxJava已經(jīng)為我們提供了一下幾個(gè)Scheduler

Schedulers.immediate():直接在當(dāng)前線程運(yùn)行,相當(dāng)于不指定線程。這是默認(rèn)的?Scheduler。

Schedulers.newThread():總是啟用新線程,并在新線程執(zhí)行操作。

Schedulers.io(): I/O 操作(讀寫文件、讀寫數(shù)據(jù)庫、網(wǎng)絡(luò)信息交互等)所使用的?Scheduler。行為模式和?newThread()?差不多,區(qū)別在于?io()?的內(nèi)部實(shí)現(xiàn)是是用一個(gè)無數(shù)量上限的線程池,可以重用空閑的線程,因此多數(shù)情況下?io()?比?newThread()?更有效率。不要把計(jì)算工作放在?io()?中,可以避免創(chuàng)建不必要的線程。

Schedulers.computation():計(jì)算所使用的?Scheduler。這個(gè)計(jì)算指的是 CPU 密集型計(jì)算,即不會(huì)被 I/O 等操作限制性能的操作,例如圖形的計(jì)算。這個(gè)?Scheduler?使用的固定的線程池,大小為 CPU 核數(shù)。不要把 I/O 操作放在?computation()?中,否則 I/O 操作的等待時(shí)間會(huì)浪費(fèi) CPU。

?AndroidSchedulers.mainThread():它指定的操作將在 Android 主線程運(yùn)行。

多次切換線程

看完上面的介紹想必對(duì)RxJava線程的切換有了一些理解,上面只是對(duì)事件的發(fā)起和消費(fèi)制定了線程。如果中間有map之類的操作呢?是否可以實(shí)現(xiàn)發(fā)起的線程在新線程中,map的處理在IO線程,最后的消費(fèi)在主線程中。

        Observable.just("Hello", "Wrold")
                .subscribeOn(Schedulers.newThread())//指定:在新的線程中發(fā)起
                .observeOn(Schedulers.io())         //指定:在io線程中處理
                .map(new Func1() {
                    @Override
                    public String call(String s) {
                        return handleString(s);       //處理數(shù)據(jù)
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())//指定:在主線程中處理
                .subscribe(new Action1() {
                    @Override
                    public void call(String s) {
                        show(s);                       //消費(fèi)事件
                    }
                });

可以看到observeOn()被調(diào)用了兩次,分別指定了map的處理的現(xiàn)場(chǎng)和消費(fèi)事件show(s)的線程。

若將observeOn(AndroidSchedulers.mainThread())去掉會(huì)怎么樣?不為消費(fèi)事件show(s)指定線程后,show(s)會(huì)在那里執(zhí)行?
其實(shí),observeOn()?指定的是它之后的操作所在的線程。也就是說,map的處理和最后的消費(fèi)事件show(s)都會(huì)在io線程中執(zhí)行。
observeOn()可以多次使用,可以隨意變換線程
小結(jié)

學(xué)會(huì)線程控制后才算是真正學(xué)會(huì)了使用RxJava。RxJava的使用十分靈活,想要對(duì)其熟悉使用只有一個(gè)辦法,那就是多用啦,熟能生巧。

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73397.html

相關(guān)文章

  • 扔物線:給 Android 開發(fā)者 RxJava 詳解

    摘要:觀察者模式面向的需求是對(duì)象觀察者對(duì)對(duì)象被觀察者的某種變化高度敏感,需要在變化的一瞬間做出反應(yīng)。規(guī)定,當(dāng)不會(huì)再有新的發(fā)出時(shí),需要觸發(fā)方法作為標(biāo)志。在事件處理過程中出異常時(shí),會(huì)被觸發(fā),同時(shí)隊(duì)列自動(dòng)終止,不允許再有事件發(fā)出。 我從去年開始使用 RxJava ,到現(xiàn)在一年多了。今年加入了 Flipboard 后,看到 Flipboard 的 Android 項(xiàng)目也在使用 RxJava ,并且使...

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

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

0條評(píng)論

閱讀需要支付1元查看
<