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

并沒有關系的圖

前言

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

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

介紹

RxJava在不指定線程的情況下,發起時間和消費時間默認使用當前線程。所以之前的做法

        Observable.just(student1, student2, student2)//使用map進行轉換,參數1:轉換前的類型,參數2:轉換后的類型.map(new Func1<Student, String>() {@Overridepublic String call(Student i) {String name = i.getName();//獲取Student對象中的namereturn name;//返回name}}).subscribe(new Action1<String>() {@Overridepublic void call(String s) {nameList.add(s);}});

因為是在主線程中發起的,所以不管中間map的處理還是Action1的執行都是在主線程中進行的。若是map中有耗時的操作,這樣會導致主線程擁塞,這并不是我們想看到的。

Scheduler

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

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

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

  • subscribeOn():指定subscribe()?所發生的線程,即?Observable.OnSubscribe?被激活時所處的線程。或者叫做事件產生的線程。
  • observeOn():指定Subscriber?所運行在的線程。或者叫做事件消費的線程。

以及參數Scheduler,RxJava已經為我們提供了一下幾個Scheduler

  • Schedulers.immediate():直接在當前線程運行,相當于不指定線程。這是默認的?Scheduler。
  • Schedulers.newThread():總是啟用新線程,并在新線程執行操作。
  • Schedulers.io(): I/O 操作(讀寫文件、讀寫數據庫、網絡信息交互等)所使用的?Scheduler。行為模式和?newThread()?差不多,區別在于?io()?的內部實現是是用一個無數量上限的線程池,可以重用空閑的線程,因此多數情況下?io()?比?newThread()?更有效率。不要把計算工作放在?io()?中,可以避免創建不必要的線程。
  • Schedulers.computation():計算所使用的?Scheduler。這個計算指的是 CPU 密集型計算,即不會被 I/O 等操作限制性能的操作,例如圖形的計算。這個?Scheduler?使用的固定的線程池,大小為 CPU 核數。不要把 I/O 操作放在?computation()?中,否則 I/O 操作的等待時間會浪費 CPU。
  • ?AndroidSchedulers.mainThread():它指定的操作將在 Android 主線程運行。

多次切換線程

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

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

可以看到observeOn()被調用了兩次,分別指定了map的處理的現場和消費事件show(s)的線程。

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

小結

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

以上有錯誤之處感謝指出

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280150.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sed: -e expression #1, unknown option to `s'解決辦法

報錯如下&#xff1a; sed: -e expression #1, char 13: unknown option to s 需要替換的行為&#xff1a; monitor.urlhttp://192.168.25.100:8443/rest 查詢資料得知&#xff0c;報錯是因為替換的字符串包含有分隔符/ 所以這行改一下分隔符就可以解決問題了 改成感嘆號!或者|…

Linux常用開發環境軟件-Redis安裝(docker環境下)

linux&#xff0c;docker安裝RabbitMQ版本 1、從docker官網倉庫下載安裝RabbitMQ鏡像 官網地址&#xff1a;https://hub.docker.com/ docker pull redis:4.0.8  //后面是版本,Tag Name 2、啟動Docker Redis鏡像 docker run -d -p 6379:6379 redis:4.0.8  啟動鏡像&#xff…

以當天日期時間,打包目錄

#備份/data目錄#!/bin/bash DATEdate %Y-%m-%d-%H:%M:%S tar cvf /mnt/resource/script/prod_master_data.$DATE.tar.gz /data[root111 script]# ll total 2536 -rw-r--r-- 1 root root 2590720 Feb 22 21:46 prod_master_data.2019-02-22-21:46:53.tar.gz轉載于:https://blog.…

lvs+keepalived詳解

常用軟件安裝及使用目錄 資源鏈接&#xff1a;https://pan.baidu.com/s/15rFjO-EnTOyiTM7YRkbxuA 網盤分享的文件在此 官網&#xff1a;http://www.linuxvirtualserver.org/index.html 中文資料 LVS項目介紹 http://www.linuxvirtualserver.org/zh/lvs1.html …

微信自動打卡

要有第二臺安卓 手機&#xff0c;打開usb、adb調試&#xff0c;永不鎖屏&#xff0c;永不休眠&#xff0c;手機安裝了微信并至少成功登陸過一次&#xff0c; 一臺不關機的電腦&#xff0c;手機連接電腦&#xff0c;Appium服務器保持啟動&#xff0c;在開始菜單 設定好任務計劃程…

利用反射做類參數的校驗

需求描述 業務需求描述&#xff1a;對webservice接口參數校驗 代碼實現 /*** 字符串長度校驗* * param str* param len* return 合法(true),不合法(false)*/public static boolean check(String str, int len) {if (null ! str && str.length() > len) {return fals…

跨域的四種方式

本文主要是關于跨域的幾種方式&#xff0c;關于什么是跨域這里就不多說了&#xff0c;寫這個也是為了記住一些知識點的。 一. jsonp jsonp的跨域方式很容易理解&#xff0c;頁面的的每一個script標簽瀏覽器都會發送get請求獲取對應的文本資源&#xff0c;獲取到了之后&#xff…

Linux之read命令使用

ead命令&#xff1a; read 命令從標準輸入中讀取一行&#xff0c;并把輸入行的每個字段的值指定給 shell 變量 1&#xff09;read后面的變量var可以只有一個&#xff0c;也可以有多個&#xff0c;這時如果輸入多個數據&#xff0c;則第一個數據給第一個變量&#xff0c;第二個數…

python之路day10-命名空間和作用域、函數嵌套,作用域鏈、閉包

楔子 假如有一個函數&#xff0c;實現返回兩個數中的較大值&#xff1a; def my_max(x,y):m x if x>y else yreturn mbigger my_max(10,20)print(bigger) 之前是不是我告訴你們要把結果return回來你們就照做了&#xff1f;可是你們有沒有想過&#xff0c;我們為什么要把結…

hive(II)--sql考查的高頻問題

在了解別人hive能力水平的時候&#xff0c;不管是別人問我還是我了解別人&#xff0c;有一些都是必然會問的東西。問的問題也大都大同小異。這里總結一下我遇到的那些hive方面面試可能涉及的問題 1、行轉列&#xff08;列轉行&#xff09; 當我們建設數據倉庫時&#xff0c;我們…

java概述

一、java平臺無關&#xff1a;jvm二、java健壯語言&#xff1a;無指針&#xff0c;語法上無指正&#xff0c;無內存申請與釋放。 三、java核心機制而&#xff1a; jvmjava垃圾收集機制 GC四、java運行過程&#xff1a;源程序&#xff08;.java&#xff09;——》java編譯器——…

時間間隔

計算當前時間與上次執行時間的時間間隔。 NSTimeInterval timetravel [[NSDate date]timeIntervalSinceDate:self.lastPlaySoundDate];if (timetravel<3.0) {DLog("時間太短&#xff0c;。。");}self.lastPlaySoundDate [NSDate date]; 轉載于:https://www.cnb…

.Net+MySQL組合開發(二) 數據訪問篇

一、建立數據庫、表、添加數據這里我們使用圖形化操作的SQL Manager 2005 Lite for MySQL來建立數據&#xff0c;它的操作界面非常類似OFFICE軟件&#xff0c;使用方便、很容量上手、下面開始建立數據庫及表單擊"Creat New DataBase"&#xff1a;新建DB輸入密碼&…

Git vs SVN

一、Git vs SVN Git 和 SVN 孰優孰好&#xff0c;每個人有不同的體驗。Git是分布式的&#xff0c;SVN是集中式的這是 Git 和 SVN 最大的區別。若能掌握這個概念&#xff0c;兩者區別基本搞懂大半。因為 Git 是分布式的&#xff0c;所以 Git 支持離線工作&#xff0c;在本地可以…

.net api 和java平臺對接技術總結

這兩天 一直和京東對接接口&#xff0c;我們用.net api 提供接口&#xff0c;對方用java調用&#xff0c;本來沒什么問題&#xff0c;但是對方對數據安全要求特別嚴&#xff0c;要驗簽&#xff0c;于是噩夢開始了。 1、在傳輸的時候&#xff0c;約定傳輸格式&#xff1a; HttpW…

Burpsuite學習(4)

2019獨角獸企業重金招聘Python工程師標準>>> burpsuite spider模塊通過跟蹤 HTML 和 JavaScript 以及提交的表單中的超鏈接來映射目標應用程序&#xff0c;它還使用了一些其他的線索&#xff0c;如目錄列表&#xff0c;資源類型的注釋&#xff0c;以及 robots.txt 文…

Git刪除分支/恢復分支

這是https://www.cnblogs.com/utank/p/7880441.html的方法&#xff0c;雖然很老現在有點不一樣&#xff0c;但總體還是能用的。 總結就是兩種方法 1.用commit的id恢復 2.用reflog的頭指針恢復 ?刪除一個已被終止的分支 如果需要刪除的分支不是當前正在打開的分支&#xff0c;使…

NetCore2.0Web應用之Startup

為什么80%的碼農都做不了架構師&#xff1f;>>> 作為main函數的程序啟動文件UseStartup 默認就是調用我們的整個應用程序的啟動文件 class Program{static void Main(string[] args){var host new WebHostBuilder().UseKestrel() // 指定WebServer為Kes…

windows XP系統下oracle完整卸載過程

NT環境下&#xff1a; 1、以NT的Administrator 登陸 2、通過控制面版-〉服務&#xff0c;停掉所有ORACLE服務 3、打開注冊表&#xff08;REGEDIT命令&#xff09;&#xff0c;刪除HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE 4、打開注冊表中的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentCont…

Hadoop----hdfs的基本操作

2019獨角獸企業重金招聘Python工程師標準>>> HDFS操作文件的基本命令 1.創建文件夾 $>hdfs dfs -mkdir /user/centos/hadoop 2.展示目錄 $>hdfs dfs -ls -r /user/centos/hadoop 3.遞歸展示 $>hdfs dfs -lsr /user/centos/hadoop 4.上傳文件 $&g…