Ich fange gerade mit Retrofit und Rx und ein Lächeln API erstellt, whith solche (kodein) Konfiguration:Retrofit 2, Rx 2 und async ruft
bind<CallAdapter.Factory>() with singleton {
RxJava2CallAdapterFactory.create()
}
bind<RetrofitInterface>() with singleton {
val retrofit = Retrofit.Builder()
.client(instance())
.baseUrl(instance<String>("apiRoot"))
.addCallAdapterFactory(instance())
.addConverterFactory(instance())
.build()
retrofit.create(RetrofitInterface::class.java)
}
Nun scheint es, dass, wenn ich meine API-Methoden aufrufen durch Retrofit erstellt, sie auf aktuellen Thread abonniert bekommen, anstatt den Thread Satz in .subscribeOn(someThread)
, wie wenn ich rufe:
registrationSession(mUserName, PublicKeyType.XXXX, TargetType.YYYY)
.subscribeOn(io.reactivex.schedulers.Schedulers.newThread())
...
.subscribe(
{
},
{ error ->
Log.e("Error", error.message)
}
)
die Nachrüstung registrationSession
geliefert wird die Anfrage sofort, auf Hauptthread nennen, nicht, wenn ich zu abonnieren, die Ich würde nicht erwarten (aber andererseits - ich bin nur mit Rx starten, könnte ich falsch sein)
Nur falls Sie sich fragen, wie registrationSession definded ist, dann ist es eine einfache Funktion Wrapper über diese:
@POST("registration/session")
fun registrationSession(
@Header(Constants.LB_DEVICEID_HEADER) deviceUuid: String,
@Body registrationSessionPost: RegistrationSessionPost
): Observable<Response>
So was kann ich tun registrationSession
laufen auf machen anderes Thema? Gibt es einen Weg?
Ich bin mir nicht sicher, was Sie mit "INMEDIATELY, nicht, wenn ich abonniere". Sie rufen subscribe auf, nachdem Ihre Methode das beobachtbare Objekt zurückgegeben hat. Was lässt Sie glauben, dass der Code nicht sofort ausgeführt wird? – donfuxx
Ich dachte, registrationSession() Call würde eine Observable zurückgeben, die zugrunde liegenden Remote-Aufruf auf Schedulers.newThread() ausgeführt wird, wenn abonniert, obwohl ich sofort wie oben abonnieren. Wenn die Annahme falsch ist - was muss ich tun, damit die Anfrage auf einem anderen Thread ausgeführt wird? – ssuukk
Ja, es läuft mit dem Scheduler, der in der Methode 'subscribeOn' bereitgestellt wird. Bist du wirklich sicher, dass es auf Haupt-Thread läuft? In der Theorie, wenn Sie die 'subscribeOn' Zeile entfernen, wird es im Hauptthread laufen und eine" NetworkOnMainThread "Ausnahme in Ihrem Fehlerprotokoll erzeugen, wenn Sie dort Netzwerkverbindungen machen – donfuxx