2015-10-29 9 views
72

RetrofitネットワークリクエストでSchedulers.newThread()Schedulers.io()を使用するメリットは何ですか?私はio()を使用する多くの例を見てきましたが、なぜそれを理解したいのですか?Rxjava Scheduler.newThread()vs Schedulers.io()との連携強化

例の状況:私が見てきた理由の

observable.onErrorResumeNext(refreshTokenAndRetry(observable)) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread())... 

一つの対

observable.onErrorResumeNext(refreshTokenAndRetry(observable)) 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread())... 

がある -

newThread()は、各作業単位のための新しいスレッドを作成します。 io()はスレッドプールを使用します

しかし、その引数がアプリに与える影響は何ですか?他にどのような側面がありますか?

答えて

84

Schedulers.io()を使用する利点は、スレッドプールを使用するという点にありますが、Schedulers.newThread()ではありません。

スレッドプールの使用を検討する主な理由は、あらかじめ作成された多数のスレッドがアイドル状態にあり、作業を待っていることです。つまり、作業が完了したら、スレッドを作成するオーバーヘッドを行う必要はありません。作業が完了すると、スレッドは常にスレッドを作成および破棄するのではなく、将来の作業に再利用できます。

スレッドの作成にはコストがかかる可能性があるため、作成中のスレッドの数を最小限に抑えるのが一般的です。スレッドプールの詳細については

、私はお勧め:

+4

はに基づいているScheduler.io()についてのコメントを追加する価値があるかもしれませんいくつかのユースケースには適さない無限のスレッドプールhttp://stackoverflow.com/questions/31276164/rxjava-schedulers-use-cases –

+0

@DaveMotenどのユースケースが 'Schedulers.io'経由でスレッドプールに不適切なのですか? –

+2

'Schedulers.io()'と並行して多くの作業をしているなら、OSの入出力制限にぶつかる可能性があります(例えば、開いているファイルの最大数、信頼性のために開いている最大数のTCP接続処分後も一定期間)。また、新しいスレッドには最小限のRAM(512K以上> 1M)が必要なため、RAMが不足する可能性があります。 –

関連する問題