2015-10-29 11 views
72

Was sind die Vorteile Schedulers.newThread() vs Schedulers.io() in Retrofit Netzwerkanforderung zu verwenden. Ich habe viele Beispiele gesehen, die io() verwenden, aber ich möchte verstehen, warum.Nachrüstung mit Rxjava Schedulers.newThread() vs Schedulers.io()

Beispiel Situation:

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

vs

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

Einer der Gründe, die ich gesehen habe, ist -

newThread() erstellt einen neuen Thread für jede Arbeitseinheit. io() verwendet einen Thread-Pool

Aber was ist der Einfluss dieses Arguments auf die App? Und welche anderen Aspekte gibt es?

Antwort

84

Sie haben Recht, dass der Vorteil der Verwendung von Schedulers.io() in der Tatsache liegt, dass es einen Thread-Pool verwendet, während Schedulers.newThread() nicht.

Der Hauptgrund, warum Sie die Verwendung von Thread-Pools in Betracht ziehen sollten, besteht darin, dass sie eine Reihe von vordefinierten Threads verwalten, die inaktiv sind und auf ihre Arbeit warten. Dies bedeutet, dass Sie, wenn Sie Arbeit erledigen müssen, nicht den Overhead des Erstellens eines Threads durchgehen müssen. Sobald Ihre Arbeit erledigt ist, kann dieser Thread auch für zukünftige Arbeiten wiederverwendet werden, anstatt ständig Threads zu erstellen und zu zerstören.

Die Erstellung von Threads kann teuer sein, daher ist die Minimierung der Anzahl der Threads, die Sie im laufenden Betrieb erstellen, im Allgemeinen gut.

Weitere Informationen über die Thread-Pools, empfehle ich:

+4

Might einen Kommentar Scheduler.io lohnen Zugabe() auf ein basiert unbegrenzter Thread-Pool, der für einige Anwendungsfälle möglicherweise nicht geeignet ist. Siehe http://stackoverflow.com/questions/31276164/rxjava-scheduler-user-cases –

+0

@DaveMoten Welche Anwendungsfälle sind für den Thread-Pool über 'Schedulers.io' ungeeignet? –

+2

Wenn Sie viel Zeit mit 'Schedulers.io()' haben, dann könnten Sie die Grenzen des Betriebssystems erreichen (zum Beispiel maximale Anzahl geöffneter Dateien, maximale Anzahl TCP-Verbindungen, die aus Gründen der Zuverlässigkeit offen bleiben können) für einen Zeitraum auch nach der Entsorgung). Jeder neue Thread benötigt außerdem eine minimale nicht-triviale Menge an RAM (> 512K, aber arbeitet mit 1M), so dass Ihnen der Arbeitsspeicher ausgehen könnte. –

Verwandte Themen