Retrofit with Rxjava : Schedulers.newThread() vs Schedulers.io()
阿新 • • 發佈:2019-01-04
翻譯自 Retrofit with Rxjava Schedulers.newThread() vs Schedulers.io() stackoverflow討論版
提問:
在使用Retrofit網路請求時使用 Schedulers.newThread() 和 Schedulers.io() 各有什麼好處?我在許多的專案中見到的是使用 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() 使用的是執行緒池來管理
我想知道這個原因具體對我們的應用程式有怎樣的影響,其他方面還有什麼原因呢?
回答:
這個原因是正確的,確實 Schedulers.io() 使用的好處在於它是使用執行緒池,而Schedulers.newThread()不是。
你應該考慮使用執行緒池的主要原因,是它們維護了許多空閒且等待工作的預建立線程。這意味著當你完成工作時,你不需要經歷建立執行緒的開銷。完成工作後,該執行緒也可以重新用於之後的工作,而不是不斷建立和銷燬執行緒。
執行緒建立起來可能很昂貴,因此最大限度地減少動態建立的執行緒數會更好一些。
有關執行緒池的更多資訊,我建議:
另外,如果你有很多併發工作要使用 Schedulers.io() ,那麼你可能會遇到OS i / o限制(比如說,開啟檔案的最大數量,tcp連線的最大數量,為了保證可靠性,即使在處置後也可能保持開啟一段時間) 。每個新執行緒還需要一個最小的但不可忽視的RAM(> 512K,但工作在1M),因此你可能會用完RAM。