如何仅在前台使用 RxJava 创建周期性网络请求?
How to create periodic network request with RxJava only in foreground?
应该如何解决这样的问题:假设我需要创建周期性网络请求,这应该只发生在应用程序在前台时,因为如果它们发生在后台网络中请求可以终止,有后台服务。我知道您需要此代码来进行定期请求:
Observable.fromCallable(networkRequest())
.repeatWhen(observable -> observable.delay(5, TimeUnit.SECONDS));
问题是,当app在后台时,它会继续执行..
我考虑过以某种方式添加 LiveData,以便在 onStop 中取消订阅并在 onStart 中继续。但是,我找不到正确的方法。
如果我将所有这些添加到 CompositeDisposable,它可以终止我的网络请求,如果我调用 disposable.clear () 在停止时。所以这也不是正确的解决方案。
我也想获得 ViewModel 的解决方案,但如果无法解决,那么 activity 也适合作为观察者。
您可以像这样使用 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();
}
}
}
应该如何解决这样的问题:假设我需要创建周期性网络请求,这应该只发生在应用程序在前台时,因为如果它们发生在后台网络中请求可以终止,有后台服务。我知道您需要此代码来进行定期请求:
Observable.fromCallable(networkRequest())
.repeatWhen(observable -> observable.delay(5, TimeUnit.SECONDS));
问题是,当app在后台时,它会继续执行..
我考虑过以某种方式添加 LiveData,以便在 onStop 中取消订阅并在 onStart 中继续。但是,我找不到正确的方法。
如果我将所有这些添加到 CompositeDisposable,它可以终止我的网络请求,如果我调用 disposable.clear () 在停止时。所以这也不是正确的解决方案。
我也想获得 ViewModel 的解决方案,但如果无法解决,那么 activity 也适合作为观察者。
您可以像这样使用 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();
}
}
}