2016-07-14 15 views
3

Ich habe ein seltsames Problem, das mit Retrofit zu tun scheint.Was passiert, nachdem die Nachrüstungsanforderung abgeschlossen wurde?

Sagen wir, dass ich eine Beispiel-App habe, die nur eine Aktivität hat. Es hat auch windowBackground rote Farbe in der styles.xml gesetzt. Jetzt mache ich so etwas wie dies in onCreate:

public void onCreate() { 
    retrofit.foo() 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe({ response -> 
      // ignore 
     }, { error -> 
      finish() 
     }) 
} 

es zu testen ich diese App auch ohne Internetverbindung laufen lasse, so ruft es immer onError.

Ich erwarte, dass, nachdem ich die App starten, wird es roten Hintergrund zeigen, versuchen, eine Anfrage zu machen, und dann wird es anrufen finish() und Aktivität wird geschlossen. Funktional scheint es zu funktionieren, aber visuell gibt es ein komisches Problem. Es zeigt einen roten Hintergrund, dann wird es für einen Moment schwarz und dann wieder rot und schließlich ist die App geschlossen.

Ich habe versucht, Retrofit Anruf durch eine einfache Observable zu ersetzen, die Fehler nach einiger Verzögerung ausgibt und es funktionierte korrekt (kein schwarzer Hintergrund). Deshalb denke ich, dass es etwas mit Retrofit zu tun hat. Das Verhalten ist das gleiche, wenn ich onErrorResumeNext mache und finish() in onNext anrufen. Aber wenn ich Internetverbindung habe und der Anruf erfolgreich war, dann gibt es keinen schwarzen Hintergrund. Es scheint, als ob etwas passiert, wenn kein HTTP-Fehler auftritt.

Nach einigen Untersuchungen habe ich festgestellt, dass es wahrscheinlich nicht OKHttp Schuld ist. Ich wickelte OkHttp Anruf in Obsevable.create und wenn es einen Fehler ausgab rief ich finish(). In diesem Fall kein schwarzer Bildschirm. Nur bei Verwendung von Retrofit. Ich habe auch versucht, Retrofit ohne RxJava - einfach call.enqueue und es funktioniert nicht richtig (schwarzer Bildschirm wird angezeigt).

Ich benutze Retrofit 2.0.2 mit RxJava Adapter. Und ich habe dieses Problem auf Android 5.1.1 reproduziert.

+0

So wird der rote Hintergrund im Layout XML festgelegt? Setzen Sie selbst irgendwo in der App einen schwarzen Hintergrund? Ist es möglich, dass das schwarze bg angezeigt wird, wenn du versuchst, zu viel im Hauptthread zu laufen? –

+0

Hintergrund wird im App-Design mithilfe des windowBackground-Attributs festgelegt. Aktivität hat überhaupt kein Layout. Vielleicht hast du Recht und es ist zu viel Arbeit im Hauptthread, aber es ist nicht meine Arbeit. Ich habe keinen anderen Code als oben beschrieben. –

+0

Versuchen Sie, die 'subscribe' Parameter zu ändern, um nichts zu tun und sehen Sie, ob noch passiert. Wenn es immer noch passiert, dann ist es der Observable-Observer-Synchronisationsmechanismus, der den Haupt-Thread einfriert. –

Antwort

0

Ich denke, was Sie möglicherweise ein Problem mit Aktivitätsanimation haben. Versuchen Sie Aktivitätsanimation mit

zu deaktivieren
public void onCreate() { 
    retrofit.foo() 
     .subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe({ response -> 
      // ignore 
     }, { error -> { 
       finish(); 
       overridePendingTransition(0, 0); 
      } 
     }) 
} 
+0

Vergessen zu erwähnen, dass ich es bereits versucht habe :) –

Verwandte Themen