2015-10-29 26 views
72

Retrofit ağ isteğinde Schedulers.newThread() vs Schedulers.io() kullanmanın yararları nelerdir. io()'u kullanan birçok örnek gördüm, ama nedenini anlamak istiyorum.Rxjava Schedulers.newThread ile Retrofit() vs Schedulers.io()

Örnek durum:

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

gördüğüm nedenlerinden

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

biri

vs olduğunu -

newThread() işin her birim için yeni bir iş parçacığı oluşturur. io() bir iş parçacığı havuzu kullanacaktır

Ancak bu argümanın uygulamadaki etkisi nedir? Ve diğer yönleri nelerdir?

cevap

84

Schedulers.io() kullanmanın yararının, bir iş parçacığı havuzu kullanması gerçeğinde yatmaktadır, oysa Schedulers.newThread() bunu yapmaz.

İş parçacığı havuzlarını kullanmayı düşünmeniz gereken birincil neden, boşta ve iş için beklemekte olan önceden oluşturulmuş bir dizi iş parçacığı bulundurmalarıdır. Bu, yapılacak işiniz olduğunda, bir iş parçacığı oluşturmanın genel giderlerinden geçmenize gerek olmadığı anlamına gelir. İşiniz bittiğinde, bu iş parçacığı sürekli olarak iş parçacığı oluşturmak ve yok etmek yerine gelecekteki işler için yeniden kullanılabilir.

İş parçacıkları oluşturmak için pahalı olabilir, böylece anında oluşturduğunuz iş parçacıklarının sayısını en aza indirir. İplik havuzları hakkında daha fazla bilgi için

, ben tavsiye:

+4

bir dayandırılmıştır Scheduler.io() hakkında bir yorum ekleyerek değerinde olabilir Bazı kullanım durumları için uygun olmayan sınırsız iş parçacığı havuzu. Bkz. Http://stackoverflow.com/questions/31276164/rxjava-schedulers-use-cases –

+0

@DaveMoten Kullanım örnekleri, "Schedulers.io" ile iş parçacığı havuzu için uygun değildir? –

+2

'Schedulers.io()' ile çok fazla eşzamanlı çalışmanız varsa, OS i/o limitlerine çarpabilirsiniz (örneğin, açık dosyaların maksimum sayısı, güvenilirlik amaçları için açık kalabilecek maksimum tcp bağlantı sayısı bertaraf edildikten sonra bile bir süre için. Her yeni iş parçacığı da azami önemsiz bir RAM miktarı gerektirir (> 512K, ancak 1M'de çalışır), böylece RAM'iniz bitmiş olur. –