2015-10-29 94 views
72

進行改造使用Schedulers.newThread()Schedulers.io()Retrofit網絡請求有什麼好處。我見過很多使用io()的例子,但我想明白爲什麼。使用Rxjava Schedulers.newThread()vs Schedulers.io()

示例情況:

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

VS

observable.onErrorResumeNext(refreshTokenAndRetry(observable)) 
    .subscribeOn(Schedulers.io()) 
    .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()'並行的工作,那麼你可能會碰到操作系統的I/O限制(例如打開文件的最大數量,出於可靠性目的可能保持打開的最大TCP連接數甚至在處置之後的一段時間)。每個新線程還需要最少數量的RAM(> 512K,但工作在1M),因此可能會耗盡內存。 –