Повторный запуск вызова Retrofit и повторной подписки на Observable из обратного вызова onError в RXJava - PullRequest
0 голосов
/ 29 августа 2018

Когда вызов Retrofit не удается (например, из-за отсутствия Интернета), вызывается, как и ожидалось, обратный вызов RXJava onError, где у меня есть Snackbar с прослушивателем setAction(), обозначенным интуитивно понятной строкой «Retry» где я должен передать команду, чтобы начать снова сетевой вызов. Я мог бы перезапустить класс, где я нахожусь внутри, вызывая его NameActivity(), но это выглядит ужасно. Какую команду я могу передать слушателю Snackbar, чтобы перезапустить приведенный ниже код?

 MyViewModel!!.getPost("132")
            ?.subscribeOn(schedulerProvider!!.io())
            ?.observeOn(schedulerProvider!!.ui())
            ?.doOnNext {
                run {
                    spinner.setVisibility(View.VISIBLE)
                }
            }

            ?.subscribe(object : FlowableSubscriber<List<Post>> {
                override fun onError(t: Throwable?) {
                    spinner.setVisibility(View.GONE)

                    spinner.visibility
                    Snackbar.make(view.findViewById(R.id.linearLayout), "Check Internet Connection!", Snackbar.LENGTH_INDEFINITE)
                            .setAction("Retry", {})//HERE THE COMMAND SHOULD PASS
                            .show();

                }

                override fun onComplete() {
                    Log.d("TAG", "onComplete: ")
                }

                override fun onSubscribe(s: Subscription) {
                    s.request(Long.MAX_VALUE);

                }

                override fun onNext(posts: List<Post>?) {
                    spinner.setVisibility(View.GONE)

                    posts?.let { viewAdapter.setTitleData(it) }

                }
            })
}

1 Ответ

0 голосов
/ 29 августа 2018

Если вы хотите показать снэк-бар сразу после сбоя вызова, вам нужно снова позвонить по подписке. Вы можете изменить свой код следующим образом:

  1. Поместите ваш код Rx в метод. например doNetworkCall().
  2. Создайте отдельный метод для обработки ваших ошибок. например handleError(t: Throwable).
  3. Внутри этого метода вы можете отобразить ваш Snackbar и вызвать метод doNetworkCall(), как только пользователь коснется действия повтора.

Пример:

fun doNetworkCall() {
    MyViewModel!!.getPost("132")
            ?.subscribeOn(schedulerProvider!!.io())
            ?.observeOn(schedulerProvider!!.ui())
            // The rest of the code here was removed for brevity.
             ?.subscribe(object : FlowableSubscriber<List<Post>> {
                override fun onError(t: Throwable?) {
                    spinner.setVisibility(View.GONE)
                    spinner.visibility

                    handleError(t) // Call the method here.
                }
            // The rest of the code here was removed for brevity.
}

fun handleError(t: Throwable?) {
    // Here you can also check the type of the error, and perhaps even change the snackbar action depending on it.
    Snackbar.make(view.findViewById(R.id.linearLayout), "Check Internet Connection!", Snackbar.LENGTH_INDEFINITE)
            .setAction("Retry", doNetworkCall()) // Set the retry action to call the doNetworkCall() method again.
            .show()
}

Вы также можете использовать автоматические повторные попытки, прежде чем что-либо предлагать пользователю. Этого можно достичь с помощью оператора Rx retry . Если ваш сетевой вызов не удастся, он автоматически снова подпишется на указанное количество попыток.

Как указано в документах ReactiveX:

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

  • Другой вариант повтора принимает единственный параметр : счетчик сколько раз следует попытаться повторно подписаться на источник Observable когда он сталкивается с ошибками. Если это число превышено, повтор не будет попытаться повторить подписку снова и вместо этого передаст последнюю ошибку onError уведомление своих наблюдателей.

  • Третий вариант повтора принимает функцию предиката в качестве параметра . Вы пишете эту функцию, чтобы принять два аргумента: счетчик целых чисел сколько повторных попыток было выполнено за это время, и указатель Throwable ошибка, которая вызвала уведомление onError. Эта функция возвращает логическое значение, указывающее, следует ли повторить попытку подписки и зеркальное отображение источника наблюдаемого. Если это не так, повторите попытку последнее уведомление об ошибке своим наблюдателям.

...