【问题标题】:Handle Retrofit service response in RxJava Android app after orientation change在方向更改后处理 RxJava Android 应用程序中的改造服务响应
【发布时间】:2016-08-09 07:42:14
【问题描述】:

我有一个 Android 应用,在单击按钮后会调用 Retrofit 服务 uploadPhoto

在此服务调用响应中,我希望收到带照片的 ID,因此我需要听取服务响应或错误。我有处理这个的代码

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

但是当活动由于方向变化而被破坏时,我取消了上述 Observable 的订阅,这可能发生在我的照片请求发送之间,但在收到响应之前。这意味着我可以上传照片,但无法获取照片 ID。

处理这种情况并在方向更改后重新订阅以获得由于方向更改而错过的结果的最佳方法是什么?

【问题讨论】:

    标签: android rx-java retrofit2


    【解决方案1】:

    由于您希望独立于活动继续上传图像,因此将订阅存储在具有更长/不同生命周期的位置可能是有意义的,例如作为Signletons 的一部分并手动处理订阅。然后,在方向更改后,检查是否有活动订阅:

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

    另一种解决方案是通过向应用清单中的活动添加属性来避免破坏活动以改变方向:

    android:configChanges="orientation|screenSize"
    

    【讨论】:

      【解决方案2】:

      根据this answer ,如果活动没有完成就取消订阅

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

      【讨论】:

      • 在重新创建活动时重新订阅有什么帮助?
      • 你是对的。它不会有帮助。您可能不会在 onCreate 方法中再次订阅 Observable,因为前一个没有取消订阅。
      • 如果我不取消订阅这个 observable,那么这个 observable 的处理程序将留在将被销毁的活动中。当结果到达时,在被销毁的活动中处理它是没有意义的。更重要的是,阻止活动被销毁是一项非常昂贵的操作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 2018-07-07
      • 2016-10-27
      • 2020-02-26
      • 1970-01-01
      • 2011-02-16
      • 2015-03-06
      相关资源
      最近更新 更多