2016-08-09 53 views
0

Ich habe einen Android-App, die einen Retrofit-Service-Aufruf uploadPhoto nach dem Button-Klick macht.Griff Retrofit Service-Antwort in RxJava Android App nach der Orientierung ändern

In diesem Aufruf Antwortdienst Ich mag würde eine Foto-ID erhalten, damit ich an die Dienstantwort oder Fehler hören müssen. Ich habe den Code, der diesen

Signletons.retrofitService.uploadPhoto(photoData) 
        .subscribe(new Action1<Response<UploadResponse>>() { 
         @Override 
         public void call(Response<UploadResponse> response) { 
          // response.body().photoId 
         } 
        }) 

Griffe Aber wenn die Aktivität aufgrund der Orientierungsänderung zerstört wird, ich abmelden aus der obigen beobachtbare und dies kann irgendwo zwischen meinem Foto Anfrage passiert gesendet wurde, aber bevor die Antwort empfangen wird. Dies bedeutet, dass ich das Foto hochladen kann, aber nicht die Foto-ID.

Was ist der beste Weg, um diese Situation zu handhaben und nach der Orientierung Änderungen resubscribe das Ergebnis, das ich aufgrund der Orientierungsänderung verpaßt zu bekommen?

Antwort

0

da Sie den Upload des Bildes unabhängig von der Tätigkeit fortsetzen wollen, könnte es sinnvoll sein, das Abonnement in Position zu speichern, die eine längere hat/unterschiedliche Lebenszeit, zum Beispiel als Teil Ihrer Signletons und behandeln Sie das Abonnement manuell. Dann, nach der Orientierungsänderung, überprüfen Sie für ein aktives Abonnement:

if (Signletons.uploadSubscription != null) { 
    activeUploadSub = Signletons.uploadSubscription 
} 

eine andere Lösung wäre, zu vermeiden, um die Aktivität zu Orientierungsänderungen zu zerstören, indem sie ein Attribut auf die Aktivität in Ihrer App Manifest hinzu:

android:configChanges="orientation|screenSize" 
-1

nach this answer, austragen nur, wenn die Aktivität nicht

beendet ist
@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (isFinishing()) { 
     subscription.unsubscribe(); 
    } else { 
     //It's an orientation change. 
    } 
    } 
+0

Wie es erneut abonnieren hilft, wenn die Aktivität neu erstellt wird wieder? –

+0

Sie haben Recht. Es wird nicht helfen. Sie können das Observable nicht erneut in der onCreate-Methode abonnieren, da die vorherige nicht abgemeldet ist. – dwursteisen

+0

Wenn ich dieses Observable nicht abbestellen werde, bleibt der Handler dieses Observablen in der Aktivität, die zerstört wird. Wenn das Ergebnis eintrifft, würde es keinen Sinn haben, es in der zerstörten Aktivität zu behandeln. Noch mehr, die Aktivität vor der Zerstörung zu bewahren ist eine sehr teure Operation. –