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?
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: