【问题标题】:How to create periodic network request with RxJava only in foreground?如何仅在前台使用 RxJava 创建定期网络请求?
【发布时间】:2019-11-19 17:32:05
【问题描述】:

应该如何处理这样的问题:假设我需要创建周期性的网络请求,这应该只发生在应用程序在前台时,因为如果它们发生在后台网络请求可以终止,有后台服务。我知道您需要此代码来处理定期请求:

  Observable.fromCallable(networkRequest())
          .repeatWhen(observable -> observable.delay(5, TimeUnit.SECONDS));

问题是,当app在后台时,它会继续执行..

我考虑过以某种方式添加 LiveData,以便在 onStop 中取消订阅并在 onStart 中继续。但是,我找不到正确的方法。

如果我将所有这些都添加到 CompositeDisposable,它可能会终止我的网络请求,如果我在 onStop 中调用disposable.clear()。所以这也不是正确的解决方案。

我也想获得 ViewModel 的解决方案,但如果在其中做不到,那么活动也适合作为观察者。

【问题讨论】:

  • LiveData 已经是生命周期感知组件。这是最适合您的方法
  • 是的,但是我应该如何结合来自 RxJava 的响应并在其之上添加 livedata?我需要的是:observeOnLifecycle

标签: android mvvm rx-java2 android-livedata


【解决方案1】:

你可以像这样使用LifecycleObserver

public class MyApplication extends Application implements LifecycleObserver {

@Override
public void onCreate() {
    super.onCreate();
    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);
Observable.defer(this::getNetworkObservable)
      .repeatWhen(observable -> observable.delay(5, TimeUnit.SECONDS));
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
private void onAppBackgrounded() {
    isOnline=false;
}


@OnLifecycleEvent(Lifecycle.Event.ON_START)
private void onAppForegrounded() {
   // restart working
isOnline=true;
}


private networkRequest() getNetworkObservable(){
    if(isOnline){
      return networkRequest();  
    }else {
        return Observable.empty();
    }

}

}

【讨论】:

  • 我在应用程序中有这样的所有者,我不知道应该如何在 onAppBackground 中正确暂停我的 RxJava 可观察链并从 onAppForeground 开始
  • 检查此链接以订阅和取消订阅 observable。stackoverflow.com/questions/52209707/…
  • 是的,我知道这一点,问题实际上不同。复合一次性终止网络请求。我不需要那个。
  • 检查已编辑的答案。它不会终止您的通话。
  • 但是如果尝试重复通话并且应用程序是后台,它也不会拨打电话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-30
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多