Как остановить сетевые запросы RxJava в onStop и выполнить в onStart? - PullRequest
0 голосов
/ 24 марта 2019

Я реализовал некоторые сетевые запросы, которые должны появляться только после выполнения других сетевых запросов, но только если пользователь находится на переднем плане . Я использую 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));
    ;
}

Я использую множество тем, чтобы выступать в качестве триггеров для новых запросов и создавать однонаправленный поток. Тем не менее, я все еще ищу другие решения для использования триггеров, не нашел их до сих пор.

Что я подумала о создании субъекта , который будет действовать как передний план / фоновый излучатель ... Однако это приведет к увеличению подписки, и я не смогу заставить ее работать правильно ...

...