我已经实现了一些网络请求,这些请求只有在执行了另一个网络请求之后才发生,但是仅当用户在前景中时才发生。我正在使用 Rx主题作为触发其他请求开始。
但是,问题是我使用的是ViewModel,并且在这里使用了比较方便的一次性用品。
我想在 ViewModel 中确定状态,而不是在Activity中确定状态,并创建一些通用处理类。这样可以确保网络请求的所有队列都在前景中而不是在后台执行。
我曾考虑过在这种情况下使用 LiveData ,但找不到任何解决方案。我可以在根单个活动中观察到,并以某种方式使用它来暂停或恢复网络请求。也许有人知道用MVVM实现它的好方法吗? :) 代码流:
//called in the viewModel
repository.setupDocument(text, compositeDisposable);
//using another subject as a trigger
public void startFirstRequest(String authToken, CompositeDisposable compositeDisposable) {
Request request = new Request(authToken);
firtRequestObservable = RetrofitFactory.create().firstRequestObservable(request);
compositeDisposable.add( firtRequestObservable.
subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.take(1)
.delay(15, TimeUnit.SECONDS)
.subscribe(success ->
{
startRequestSubjectTrigger.onNext(true);
}, error ->
{
handleErrorInstance(error);
}));
}
然后在存储库中,我这样处理代码:
public void setupDocument(String text, CompositeDisposable compositeDisposable) {
//using subject from another networkRequest to act as a trigger for executing this network request, after another request has completed, finished filtering and emitted startRequestSubjectTrigger.onNext(true)
compositeDisposable.add(startRequestSubjectTrigger.concatMap(response ->
{//this should only occur in FOREGROUND
return RetrofitFactory.create().
setDocumentTypeObservable(text);
}).subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
take(1)
.subscribe(success ->
{
//notifying main subject
responseSubject.onNext(true);
}, this::handleErrorInstance));
;
}
我正在使用很多主题,以触发新请求,并会产生单向流。但是,我仍在寻找其他解决方案以使用触发器,但仍然没有找到它们。
我关于创建主题的想法,该主题将充当前景/背景发射器。但是,这将导致更多订阅,而我无法使其正常工作。.