2015-10-29 24 views
72

Quali sono i vantaggi da utilizzare Schedulers.newThread() rispetto a Schedulers.io() nella richiesta di rete Retrofit. Ho visto molti esempi che usano io(), ma voglio capire perché.Retrofit con Rxjava Schedulers.newThread() vs Schedulers.io()

situazione Esempio:

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

vs

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

Uno dei motivi che ho visto è -

newThread() crea un nuovo thread per ogni unità di lavoro. io() utilizzerà un pool di thread

Ma qual è l'influenza di tale argomento sull'app? E quali altri aspetti ci sono?

risposta

84

È corretto che il vantaggio dell'utilizzo di Schedulers.io() risiede nel fatto che utilizza un pool di thread, mentre lo Schedulers.newThread() no.

Il motivo principale per cui si dovrebbe considerare l'utilizzo di pool di thread è che mantengono un numero di thread pre-creati che sono inattivi e in attesa di lavoro. Ciò significa che quando hai del lavoro da fare, non è necessario passare attraverso l'overhead della creazione di un thread. Una volta terminato il tuo lavoro, quel thread può anche essere riutilizzato per il lavoro futuro invece di creare e distruggere costantemente i thread.

I thread possono essere costosi da creare, quindi è generalmente consigliabile ridurre al minimo il numero di thread che si stanno creando al volo.

Per ulteriori informazioni sui pool di thread, mi raccomando:

+4

potrebbe essere la pena di aggiungere un commento su Scheduler.io() essendo basato su un pool di thread illimitati che potrebbe non essere appropriato per alcuni casi d'uso. Vedi http://stackoverflow.com/questions/31276164/rxjava-schedulers-use-cases –

+0

@DaveMoten Quali casi d'uso sono inappropriati per il pool di thread tramite 'Schedulers.io'? –

+2

Se si ha molto lavoro simultaneo con 'Schedulers.io()', allora si potrebbe imbattersi in limiti di I/O del sistema operativo (ad esempio il numero massimo di file aperti, il numero massimo di connessioni TCP che possono rimanere aperte per motivi di affidabilità) per un periodo anche dopo essere stato smaltito). Ogni nuovo thread richiede anche una quantità minima non banale di RAM (> 512 K ma funziona su 1 M) in modo da poter esaurire la RAM. –