如何仅在前台使用RxJava创建定期网络请求?

时间:2019-07-10 06:43:28

标签: android mvvm rx-java2 android-livedata

应如何解决此问题:假设我需要创建定期的网络请求,该请求仅应在应用程序处于前台时发生,因为如果它们出现在后台网络中,则请求可以在后台终止服务。我知道您需要以下代码来进行定期请求:

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

问题在于,当应用程序在后台运行时,它将继续执行。

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

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

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

1 个答案:

答案 0 :(得分: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();
    }

}

}