Rxjava2入門チュートリアル4:スケジューラのスレッドスケジューラ

スケジューラ(スレッドスケジューラ)がRxJavaに簡潔な非同期操作を与え、それがRxJava最も称賛に値すると言うことができます。
コードの前に、観測は、オブザーバーレスポンス・データ・ストリームを受信し、データストリームを送信し、データストリーム処理演算子は、同じスレッドにある、応答関数で同期して実現します。しかし、機能応答の実用的なアプリケーションは、バックグラウンド・プロセスのほとんどは、応答を受信したプロセスの場合ではありません。観察生成された送信データストリーム、およびデータストリーム処理演算子は、バックグラウンドスレッドで行われ、観察者のフォアグラウンドスレッドに対応するデータを受け入れています。
スケジューラ(スレッドスケジューラは)彼はまだ単純明快それを維持することができ、RxJavaスレッドの切り替えは、プログラム・ロジックが非常に複雑になっても、単純明快になり作ることができます。

subscribeOn

Observable<T> subscribeOn(Scheduler scheduler) 

データの特定のスレッドスケジューラスケジューラ処理動作を指定するパラメータを受信することによってスケジューラsubscribeOn。
複数の設定、一つだけの機能であれば。

observeOn

Observable<T> observeOn(Scheduler scheduler)

スケジューラobserveOnはまた、特定のスレッドスケジューラスケジューラで実行されている下流の操作を指定するためのパラメータを受け取ります。
セット数回、各時間作業する場合。

スケジューラの種

Schedulers.io():

そのような読み取りおよび書き込みSDカードファイル、データベースクエリ、アクセスネットワーク、スレッド、キャッシュメカニズムとしてIO集約型の操作のために、このディスパッチャはジョブを受信した後、アイドル状態のスレッドがあれば、そこにあるかどうか、スレッドのキャッシュ・プールをチェック常にアイドルスレッドは、新しいスレッドが無制限で作成することができない場合は、その後、そこに、新しいスレッドを作成しない場合は、再利用、およびスレッドプールに追加されます。

Schedulers.newThread():

各タスク新しいスレッドを実行するときSchedulers.io()を使用すると、スケジューラを使用することができる場所が、多重化され、時間のかかるよりも新しいスレッドのスレッドを作成するために作成することは、スレッドは、キャッシュメカニズムを持っていません。 newThread()は、しかし、Schedulers.newThread()効率Schedulers.io()高くありません。

Schedulers.computation():

ないCPU集約型の、時間のかかる操作のためのタスクを計算するI / O動作および他の性能制約、例えばXML、JSONファイルの解析、サンプリングビットマップ画像圧縮など、固定されたスレッドプール、CPUコアのサイズを有します番号。待機時間I / O操作がCPUを無駄にすることができますので、I / O操作に使用することはできません。

Schedulers.trampoline():

現在のスレッドの実装のタスクがある場合、すぐにタスクを実行するために、現在のスレッドには、一時停止、および着信挿入し、未完成のタスクを実行するようにタスク、次いで実行されます。

Schedulers.single():

シングルスレッドの例があり、このスレッドは、タスクの実行を持っている場合、すべてのタスクは、このスレッドで実行され、他のタスクは、FIFOの順序で実行されます。

Scheduler.from(@NonNullエグゼキュータ):

スケジューラは、ポリシータスクの実行を制御することによって、スレッドスケジューラを指定します。

AndroidSchedulers.mainThread():

AndroidのUIスレッドでタスクを実行し、カスタム開発さ。

注意:

RxJava2において、Schedulers.immediateにRxJava1()を放棄し
、現在のスレッドで直ちにタスクを実行するために、RxJava1にSchedulers.immediate()の役割を、Schedulers.trampolineにRxJava2と機能的に同等です()。
他のタスクが完了したときRxJava1でSchedulers.trampolineの役割は()キューイングされ、現在のスレッドライン、Schedulers.singleでRxJava2(のようなビット)でタスクを受けたが、まったく同じではない、スケジューラために開始.single()ではなく、タスクを実行するために、現在のスレッドでシングルトンスレッドに並びます。

例1:subscribeOnと再びobserveOn

次のようにコードを実行した後、コンソールが印刷されます。

System.out: 发射线程:RxCachedThreadScheduler-1---->发射:0
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:1
System.out: 接收线程:main---->接收:0
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:2
System.out: 接收线程:main---->接收:1
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:3
System.out: 接收线程:main---->接收:2
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:4
System.out: 接收线程:main---->接收:3
System.out: 接收线程:main---->接收:4

subscribeOnによって指定された観察(Schedulers.io())Schedulers.io()スレッドスケジューラにおいて、送信データを1秒ごとに、オブザーバーは、Android UIスレッドobserveOnによって指定されたデータを受信し(AndroidSchedulers.mainThread())。

例2:subscribeOnは2回使用してobserveOn一度

subscribeOn(Schedulers.io())Schedulers.io()スレッドスケジューラで観察指定し、データは、オペレータによって、1秒に1回送信することにより、地図subscribeOnを指定(Schedulers.newThread())Schedulers.newThreadで()スケジューラスレッド処理データ、observeOn(AndroidSchedulers.mainThread())を介してオブザーバのAndroid UIスレッドで指定されたデータを受信します。
結果は以下の通りであります:

System.out: 发射线程:RxCachedThreadScheduler-1---->发射:0
System.out: 处理线程:RxCachedThreadScheduler-1---->处理:0
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:1
System.out: 接收线程:main---->接收:0
System.out: 处理线程:RxCachedThreadScheduler-1---->处理:1
System.out: 接收线程:main---->接收:1

我们发现发射和处理数据均是在RxCachedThreadScheduler线程中,第二次通过subscribeOn指定的线程不起作用。

示例三:使用一次subscribeOn和两次observeOn

通过subscribeOn(Schedulers.io())指定Observable在Schedulers.io( )调度器的线程中,每隔1秒发射一次数据,通过observeOn(Schedulers.newThread())指定map操作符在Schedulers.newThread()的调度器线程中处理数据,通过observeOn(AndroidSchedulers.mainThread())指定Observer在Android UI线程中接收数据。
运行结果如下:

System.out: 发射线程:RxCachedThreadScheduler-1---->发射:0
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:1
System.out: 处理线程:RxNewThreadScheduler-1---->处理:0
System.out: 接收线程:main---->接收:0
System.out: 处理线程:RxNewThreadScheduler-1---->处理:1
System.out: 接收线程:main---->接收:1

与我们的预期结果一致

通过示例一二三,我们可以总结subscribeOn和observeOn的用法如下:

subscribeOn来指定对数据的处理运行在特定的线程调度器Scheduler上,直到遇到observeOn改变线程调度器若多次设定,则只有一次起作用。observeOn指定下游操作运行在特定的线程调度器Scheduler上。若多次设定,每次均起作用。

示例四:Schedulers.trampoline()

通过示例一二三我们可以发现,Observer处理数据相比于Observable发射的数据存在滞后的现象,Observable发射了两个数据,Observer才处理了一个,并不是Observable没发射一个,Observer就处理一个。
运行:

通过Schedulers.trampoline()/设置观察者在当前线程中处理数据,并且故意延迟两秒后在处理
控制台打印如下:

System.out: 发射线程:RxCachedThreadScheduler-1---->发射:0
System.out: 接收线程:RxCachedThreadScheduler-1---->接收:0
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:1
System.out: 接收线程:RxCachedThreadScheduler-1---->接收:1
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:2
System.out: 接收线程:RxCachedThreadScheduler-1---->接收:2
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:3
System.out: 接收线程:RxCachedThreadScheduler-1---->接收:3
System.out: 发射线程:RxCachedThreadScheduler-1---->发射:4
System.out: 接收线程:RxCachedThreadScheduler-1---->接收:4

我们可以发现虽然Observer在接收到数据后,延迟了两秒才处理,但是Observable依然在Observer将数据处理完之后才开始发射下一条。Schedulers.trampoline()的作用在当前线程立即执行任务,如果当前线程有任务在执行,则会将其暂停,等插入进来的任务执行完之后,再将未完成的任务接着执行。

示例五:Schedulers.single()

运行结果如下:

System.out: 发射线程:RxSingleScheduler-1---->发射:0
System.out: 发射线程:RxSingleScheduler-1---->发射:1
System.out: 发射线程:RxSingleScheduler-1---->发射:2

System.out: 处理线程:RxSingleScheduler-1---->处理:0
System.out: 处理线程:RxSingleScheduler-1---->处理:1
System.out: 处理线程:RxSingleScheduler-1---->处理:2

System.out: 接收线程:RxSingleScheduler-1---->接收:0
System.out: 接收线程:RxSingleScheduler-1---->接收:1
System.out: 接收线程:RxSingleScheduler-1---->接收:2

通过Schedulers.single()将数据的发射,处理,接收在Schedulers.single()的线程单例中排队执行,当此线程中有任务执行时,其他任务将会按照先进先出的顺序依次执行。



 

おすすめ

転載: blog.csdn.net/suyimin2010/article/details/88091201