2017-05-20 5 views
0

Ich habe ein Problem mit einer Android-App beim Versuch, einige Api-Daten mit RxJava2 und Retrofit2 (in Kotlin) abrufen. Sobald ich den Anruf ausführe, wird der Bildschirm schwarz und die Anwendung antwortet einfach nicht mehr, ohne irgendwelche Protokollnachrichten.RxJava2 + Retrofit schwarzen Bildschirm bei Datenanforderung

Der Aufruf URL Ich verwende ist die folgende:

api/apartments?projection={"id":1,"address":1} 

Die Service-Schnittstelle für diesen Aufruf ist dies ein:

@GET("api/apartments?projection={\"id\":1,\"address\":1}") 
    fun getAllApartments(@Header(AUTHORIZATION) auth: String): Single<List<APTLIST>> 

Dies ist die Art, wie ich den Anruf auszuführen:

override fun getAllApartments(): Single<List<APTLIST>> = retrofit.create(ApartmentsService::class.java).getAllApartments("$BEARER$token") 

Und so nenne ich die Funktion:

getAllApartmentsUseCase.getAllApartments() 
    .subscribe(
     { 
      apartments.clear() 
      apartments.addAll(it) 
      view.showApartments(apartments) 
     }, 
     { println(it.message) } 
    ) 

Dieser Aufruf funktioniert auf Postman und das Ergebnis ist die folgende:

[ 
    { 
    "_id": "591ecaca861a528a5b4c3d90", 
    "id": "ROC 03" 
    }, 
    { 
    "_id": "591a0fb2861a528a5b4c3d60" 
    }, 
    { 
    "_id": "58be94d484c4b0a468fb93e0", 
    "id": "CAN 2.3", 
    "address": "Els Refugis" 
    } 
] 
+0

versuchen sie den Endpunkt ohne Rückkehr Single zu konsumieren. Nicht sicher, dass Ihr Problem mit RX – paul

+0

zusammenhängt. Es scheint, es ist nicht, wenn der synchrone Anruf mit Nachrüstung über .execute() ausgeführt wird, friert es auch mit dem schwarzen Bildschirm ein. Vielleicht ist es die Art, wie ich diese URL-Abfrage verwende? – Joan

+0

Nicht mit Android Mate vertraut machen. Versuchen Sie einfach, eine sehr einfache Anfrage an den Endpunkt zu stellen – paul

Antwort

0

Ich denke, Sie sind in der Haupt-Thread Web-Anruf. Es ist merkwürdig, dass man so etwas wie ANR bekommt und nicht android.os.NetworkOnMainThreadException.

getAllApartmentsUseCase 
    .getAllApartments() 

    .subscribeOn(Schedulers.io()) //scheduler in which observable will execute 
    .observeOn(AndroidSchedulers.mainThread()) //scheduler in which subscriber's methods will be called 

    .subscribe(/*subscriber*/) 

https://medium.com/upday-devs/rxjava-subscribeon-vs-observeon-9af518ded53a

Verwandte Themen