Я реализовал некоторые сетевые запросы, которые должны появляться только после выполнения других сетевых запросов, но только если пользователь находится на переднем плане . Я использую Rx Subjects в качестве триггеров для другие запросы на запуск.
Однако проблема в том, что я использую 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));
;
}
Я использую множество тем, чтобы выступать в качестве триггеров для новых запросов и создавать однонаправленный поток. Тем не менее, я все еще ищу другие решения для использования триггеров, не нашел их до сих пор.
Что я подумала о создании субъекта , который будет действовать как передний план / фоновый излучатель ... Однако это приведет к увеличению подписки, и я не смогу заставить ее работать правильно ...