2015-10-29 22 views
72

Lợi ích khi sử dụng Schedulers.newThread()Schedulers.io() trong yêu cầu mạng Retrofit. Tôi đã thấy nhiều ví dụ sử dụng io(), nhưng tôi muốn hiểu tại sao.Trang bị thêm với Rxjava Schedulers.newThread() vs Schedulers.io()

Ví dụ tình huống:

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

vs

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

Một trong những lý do tôi đã thấy là -

newThread() tạo ra một thread mới cho mỗi đơn vị làm việc. io() sẽ sử dụng hồ bơi chủ đề

Nhưng ảnh hưởng của đối số đó trên ứng dụng là gì? Và những khía cạnh khác có gì?

Trả lời

84

Bạn đúng rằng lợi ích của việc sử dụng Schedulers.io() nằm trong thực tế là nó sử dụng một hồ bơi chủ đề, trong khi Schedulers.newThread() thì không.

Lý do chính mà bạn nên xem xét khi sử dụng nhóm luồng là chúng duy trì một số chuỗi được tạo trước không hoạt động và đang chờ công việc. Điều này có nghĩa rằng khi bạn có công việc phải làm, bạn không cần phải trải qua chi phí tạo chuỗi. Một khi công việc của bạn được thực hiện, chủ đề đó cũng có thể được tái sử dụng cho công việc trong tương lai thay vì liên tục tạo và hủy các luồng.

Chủ đề có thể tốn kém để tạo, do đó, việc giảm thiểu số lượng chủ đề mà bạn đang tạo trên bay nói chung là tốt.

Để biết thêm thông tin về hồ chủ đề, tôi khuyên bạn nên:

+4

Có thể là giá trị thêm một nhận xét về Scheduler.io() được dựa trên một hồ bơi thread không bị ràng buộc có thể không phù hợp với một số trường hợp sử dụng. Xem http://stackoverflow.com/questions/31276164/rxjava-schedulers-use-cases –

+0

@DaveMoten Trường hợp sử dụng nào không phù hợp cho nhóm luồng thông qua 'Schedulers.io'? –

+2

Nếu bạn có nhiều công việc đồng thời để làm với 'Schedulers.io()' thì bạn có thể gặp giới hạn OS i/o (ví dụ: số lượng tệp mở tối đa, số lượng tối đa các kết nối tcp cho mục đích độ tin cậy có thể vẫn mở trong một khoảng thời gian thậm chí sau khi được xử lý). Mỗi chủ đề mới cũng yêu cầu số lượng RAM tối thiểu không nhỏ (> 512K nhưng hoạt động trên 1M) để bạn có thể hết RAM. –

Các vấn đề liên quan