使用Rxjava Schedulers.newThread()和Schedulers.io()进行改造

Mik*_*eps 83 android rx-java retrofit rx-android

在网络请求中使用Schedulers.newThread()vs 有什么好处.我见过许多使用的例子,但我想了解原因.Schedulers.io()Retrofitio()

示例情况:

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())...
Run Code Online (Sandbox Code Playgroud)

VS

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())...
Run Code Online (Sandbox Code Playgroud)

我见过的原因之一是 -

newThread()为每个工作单元创建一个新线程.io()将使用线程池

但是这个论点对应用程序的影响是什么?还有什么其他方面?

Tan*_*.7x 96

你是正确的,使用的好处Schedulers.io()在于它使用线程池,而Schedulers.newThread()不是.

您应该考虑使用线程池的主要原因是它们维护了一些空闲且等待工作的预创建线​​程.这意味着当您完成工作时,您不需要经历创建线程的开销.完成工作后,该线程也可以重新用于将来的工作,而不是不断创建和销毁线程.

线程创建起来可能很昂贵,因此最大限度地减少动态创建的线程数通常很好.

有关线程池的更多信息,我建议:

  • 可能值得添加关于Scheduler.io()的注释基于无限制的线程池,这可能不适合某些用例.请参阅http://stackoverflow.com/questions/31276164/rxjava-schedulers-use-cases (4认同)
  • 如果你有很多与`Schedulers.io()`有关的并发工作,那么你可能会遇到OS i/o限制(例如最大打开文件数,最大tcp连接数,为了可靠性目的可能会保持打开状态)处理后的一段时间).每个新线程还需要一个最小的非平凡量的RAM(> 512K,但工作在1M),因此你可能会用完RAM. (2认同)
  • @Eido95 他们共享相同的堆,而不是相同的堆栈。就变量而言,是的,您可以在线程之间共享变量(带有有关确保这些变量是线程安全的所有典型警告)。 (2认同)