Параллельный запуск двух синглов и обработка сценариев - PullRequest
0 голосов
/ 02 марта 2020

У меня есть два сингла (getChannels и getEPGs), которые работают параллельно. В большинстве случаев getChannels завершается до getEPG, и я могу подключить EPG к каналам. Тем не менее, я хотел бы обработать случаи, когда getEPG завершаются до getChannels.

Другими словами,

  1. Оба сингла работают параллельно.
  2. Для подключения EPG, каналы должны быть загружены.
  3. Если getEPG завершены до getChannels, он должен ждать getChannels, и только тогда будет вызван метод
  4. Если getEPG завершится неудачно поток приложения будет продолжаться независимо.

Как я могу выполнить sh, не полагаясь на обратные вызовы и циклы while? Я думаю, что должен быть реактивный способ справиться с этим делом. Заранее спасибо.

@GET
Single<ResponseBody> getChannels(@Url String url);

@Streaming
@GET
Single<ResponseBody> getEPGs(@Url String url);


getChannels [.............................]

getEPGs     [..........................................]

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

2. Для подключения EPG каналы должны быть загружены.

Хорошо,

Каналы ResponseBody = getChannels.blockingGet ();

3. Если getEPG завершены до getChannels, он должен ждать getChannels, и только тогда будет вызван метод

Хорошо, дождитесь каналов и вызовите метод:

Каналы ResponseBody = getChannels.blockingGet ();

aMethod (каналы);

4. В случае сбоя getEPG поток приложения продолжится независимо.

вышеприведенные операторы действительно игнорируют результат getEPGs().

Строго говоря, все ваши условия можно выразить просто : дождитесь getChannels() и проигнорируйте getEPGs(). Этим условиям полностью удовлетворяют предложенные 2 строки кода.

0 голосов
/ 02 марта 2020

Определите свои функции в хранилище и получите к ним доступ через viewModel.

public class Repository {
    @GET
    return Single<ResponseBody> getChannels(@Url String url);

    @Streaming
    @GET
    return Single<ResponseBody> getEPGs(@Url String url);
}

Теперь класс ViewModel.

public class SiteListViewModel extends BaseViewModel {

private CompositeDisposable mDisposable;
private Repository mRepository;

  public void getData() {
      mDisposable.add(
          mRepository.getChannels().subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(obj -> {"CALL SECOND FUNCTION OVER HERE"

                },throwable -> Log.e("Error", e.printStackTrace()))
        );
    }
}
...