在Android Activity生命周期中进行改造以保持数据新鲜

时间:2017-12-21 11:16:31

标签: android retrofit rx-java

我的改造界面方法返回带有响应的rx Single

@GET("/data")
Single<Response<List<Foo>>> getData();

在我的活动onStart()方法中,我调用getData()来填充数据,直到显示加载Progress它将成功解除或失败

   getData().observeOn(AndroidSchedulers.mainThread())
            .subscribeOn(Schedulers.io())
            .doOnSubscribe(() -> showProgress("loading"))
            .doOnSuccess(listResponse -> hideProgress())
            .subscribe(new SingleSubscriber<Response<List<Foo>>>() {
                @Override
                public void onSuccess(Response<List<Cat>> response) {
                    if (response.isSuccessful()) setItems(response.body());
                }

                @Override
                public void onError(Throwable error) {
                    hideProgress(error.getMessage());
                }
            })

我第一次开始Activity一切顺利,Progress将显示,成功或失败,它会被玷污

问题是
无论何时我通过Activity开始新的startActivity(),然后再次回到我的Activity onStart(),我的Retrofit电话会再次被执行( i我每次输入Activity 时都会保持数据新鲜
 但是会发生什么呢Progress一直显示,没有成功,没有失败发生,我甚至记录了我在服务器上发出的请求,而且没有请求被请求“在我第二次不是第一次Activity打开了“

问题是RetrofitRxjava
是否有任何方法可以在每次活动开始或从堆栈中进行操作时执行新数据事件

我们是否注定要Android activity lifecycle诅咒......

2 个答案:

答案 0 :(得分:1)

我的第六感告诉我,这是一个愚蠢的错误或误解 我正在使用CompositeSubscription添加我的所有调用,并通过调用onStop()CompositeSubscription.unsubscribe()中安全取消订阅所有这些调用以防止资源泄漏 发生了什么事情,当我回到我的活动时,我正在为复合材料添加相同的subscription并立即取消订阅
文档说:

  

public void unsubscribe()

     

取消订阅自己和所有内部订阅。

     

调用此方法后,将立即取消订阅添加到CompositeSubscription&gt;的新订阅。

我通过调用clear()代替

来解决问题
  

public void clear()

     

取消订阅当前属于此&gt; CompositeSubscription的所有订阅,并将其从CompositeSubscription中删除,以便&gt; CompositeSubscription为空且能够管理新订阅。

然后您可以再次添加相同的订阅并按其通常的行为进行调用

因此而失去了24小时。 -_-。

答案 1 :(得分:0)

当您返回到您需要覆盖onResume()方法的活动时,您没有停止活动。而不是onCreate()onStart()onResume()中调用您的getData方法。这将完成这项工作。