Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrofit with Rxjava Schedulers.newThread() vs Schedulers.io()

What are the benefits to use Schedulers.newThread() vs Schedulers.io() in Retrofit network request. I have seen many examples that use io(), but I want to understand why.

Example situation:

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

vs

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

One of the reasons i have seen is -

newThread() creates a new thread for each unit of work. io() will use a thread pool

But what is the influence of that argument on the app? And what other aspects there are?

like image 281
Mikelis Kaneps Avatar asked Oct 29 '15 13:10

Mikelis Kaneps


1 Answers

You are correct that the benefit of using Schedulers.io() lies in the fact that it uses a thread pool, whereas Schedulers.newThread() does not.

The primary reason that you should consider using thread pools is that they maintain a number of pre-created threads that are idle and waiting for work. This means that when you have work to be done, you don't need to go through the overhead of creating a thread. Once your work is done, that thread can also be re-used for future work instead of constantly creating and destroying threads.

Threads can be expensive to create, so minimizing the number of threads that you are creating on the fly is generally good.

For more information on thread pools, I recommend:

  • What is the use of a Thread pool in Java?
  • What is a thread pool?
  • Thread pool pattern (Wikipedia)
like image 167
Bryan Herbst Avatar answered Oct 08 '22 03:10

Bryan Herbst