2017-12-01 4 views
-1

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?

+0

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

+0

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

+0

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

Antwort

0

Der einzige Grund dafür kann sein, dass subscribeOn (als Gegenstück zu observeOn) nur einmal aufgerufen werden kann. Um spezifisch zu sein zuerst subscribeOn Anruf funktioniert, werden andere Anrufe (oder Operatoren Verwendungen in diesem Stream) ignoriert. Stellen Sie sicher, dass subscribeOn nicht anderswo in diesem Stream aufgerufen wird.

+0

Ich weiß das. Es gibt nur einen subscribeOn-Anruf. – ssuukk

+0

Mehrere 'subscribeOn' werden nicht ignoriert https://akarnokd.blogspot.com/2017/11/when-multiple-subscribeons-do-have.html – Tuby