2016-08-09 35 views
0

我有一個Android應用程序,在按鈕單擊後使Retrofit服務調用uploadPhoto處理方向變更後,在RxJava Android應用程序中處理Retrofit服務響應

在此服務電話響應我想收到照片ID,所以我需要聽服務響應或錯誤。我有一個處理這個

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

但是,當活動被由於取向變化破壞了,我從上面可觀察退訂之間我的照片發送請求,這可能某處發生,但在收到響應之前的代碼。這意味着我可以上傳照片,但不能獲取照片ID。

處理這種情況並在方向更改後重新訂閱以獲得結果的最佳方法由於方向更改,我錯過了什麼?

回答

0

由於您希望繼續上傳與活動無關的圖像,因此將訂閱存儲在具有更長/不同生活期的位置(例如,作爲您的Signletons的一部分,並手動處理訂閱。然後,方向更改後,檢查激活訂閱:

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

另一個解決辦法是,以避免在您的應用程序的清單增加了活動的屬性摧毀方向更改活動:

android:configChanges="orientation|screenSize" 
-1

this answer,只是退訂如果活動沒有完成

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

它是如何幫助再次重新創建活動時重新訂閱? –

+0

你是對的。它不會幫助。您可能不會在onCreate方法中再次訂閱Observable,因爲前一個未取消訂閱。 – dwursteisen

+0

如果我不會退訂此可觀察項,那麼此可觀察項的處理程序將停留在將被銷燬的活動中。當結果到達時,在被銷燬的活動中沒有任何處理它的地方。更重要的是,保持活動不被破壞是一項非常昂貴的操作。 –