Как получить все каналы с разбивкой на страницы из чата Twilio с помощью RxJava2?

Попытка получить все каналы из чата Twilio с помощью twilio SDK. Хотите дождаться загрузки списка каналов (используя Observables), а затем отобразить его в моем пользовательском интерфейсе. Ниже приведено приблизительное представление о том, что я пытаюсь сделать:


private List<Paginator<ChannelDescriptor> getAllChannels() {
  ChatClient.Properties props = new ChatClient.Properties.Builder()
        .createProperties();

  ChatClient chatClient = ChatClient.create(context.getApplicationContext(),
        accessToken,
        props,
        null);

  List<Paginator<ChannelDescriptor> channelList = new ArrayList<>()

  chatClient.getChannels().getUserChannelsList(new CallbackListener<Paginator<ChannelDescriptor>>() {
    @Override
    public void onSuccess(Paginator<ChannelDescriptor> firstPaginator) {
      channelList.add(firstPaginator);
      Paginator<ChannelDescriptor> nextPaginator = firstPaginator;

      while (nextPaginator != null && nextPaginator.hasNextPage()) {
            nextPaginator = loadNextChatChannelPage(firstPaginator);
            if(nextPaginator != null) {
              channelList.add(nextPaginator);
            }
      }
    }
  });

  return channelList;
}


public Paginator<ChannelDescriptor> loadNextChatChannelPage(Paginator<ChannelDescriptor> paginator) {
    paginator.requestNextPage(new CallbackListener<Paginator<ChannelDescriptor>>() {
        @Override
        public void onSuccess(Paginator<ChannelDescriptor> channelDescriptorPaginator) {
            return channelDescriptorPaginator;
        }

        @Override
        public void onError(ErrorInfo errorInfo) {
            return null.
        }
    }));
}

Тут вообще не вопрос. Это работает? Вы получаете сообщение об ошибке? Происходит что-то неожиданное?

philnash 28.05.2019 05:53

Спасибо за ответ, вопрос был в том, как все это сделать в RXJava2, ниже разместил свое решение на случай, если кому-то оно покажется полезным.

kaliki 10.06.2019 22:27
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
2
128
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В итоге я сделал следующее:

/**
* Start loading the Twilio chat channel pages
*
* @return Single containing a list of all the chat channel pages
*/
public Single<List<Paginator<ChannelDescriptor>>> loadAllChatChannelPages(ChatClientManager chatClientManager) {
    return Single.create(emitter -> chatClientManager.getChatClient().getChannels().getUserChannelsList(new CallbackListener<Paginator<ChannelDescriptor>>() {
        @Override
        public void onSuccess(Paginator<ChannelDescriptor> channelDescriptorPaginator) {
            if(channelDescriptorPaginator != null) {
                emitter.onSuccess(channelDescriptorPaginator);
            }
        }

        @Override
        public void onError(ErrorInfo errorInfo) {
            String errorMessage = "";
            if(errorInfo != null) {
                errorMessage = errorInfo.getMessage();
            }
            emitter.onError(new Throwable(errorMessage));
        }
    })).subscribeOn(Schedulers.io())
    .flatMap(firstPaginator -> {
        if(firstPaginator != null) {
            return loadChannelPaginator((Paginator<ChannelDescriptor>) firstPaginator).toList()
                    .subscribeOn(Schedulers.io());
        } else {
            return Single.error(new Throwable("Could not get chat channels"));
        }
    });
}

/**
 * Recursively loads the chat channel pages and returns them as a single observable
 *
 * @param paginator this needs to be the first chat channel paginator from the chat client
 * @return Observable containing a flattened version of all the available chat channel paginators
 */
private Observable<Paginator<ChannelDescriptor>> loadChannelPaginator(Paginator<ChannelDescriptor> paginator) {
    if (paginator.hasNextPage()) {
        return Observable.mergeDelayError(
            Observable.just(paginator),
            loadNextChatChannelPage(paginator)
                .flatMap(this::loadChannelPaginator));
    }

    return Observable.just(paginator);
}

/**
 * Loads a single chat channel page
 *
 * @param previousPage the previous page of chat channels
 * @return Observable containing the next chat channel page
 */
private Observable<Paginator<ChannelDescriptor>> loadNextChatChannelPage(Paginator<ChannelDescriptor> previousPage) {
    return Observable.create(emitter -> previousPage.requestNextPage(new CallbackListener<Paginator<ChannelDescriptor>>() {
        @Override
        public void onSuccess(Paginator<ChannelDescriptor> channelDescriptorPaginator) {
            if(channelDescriptorPaginator != null) {
                emitter.onNext(channelDescriptorPaginator);
            }
            emitter.onComplete();
        }

        @Override
        public void onError(ErrorInfo errorInfo) {
            if(errorInfo != null) {
                String errorMessage = errorInfo.getMessage();
                Timber.e(errorMessage);
            }
//                emitter.onError(new Throwable(errorMessage));
            emitter.onComplete();
        }
    }));
}

В приведенном выше коде loadAllChatChannelPages загружает первый пагинатор.

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

Затем mergeDelayError сглаживает все пагинаторы и возвращает их как один единственный Observable.

Наконец, в getAllChannels я применяю Observable.toList(), это возвращает Single, содержащий список каналов чата с разбивкой на страницы, которые мне нужны.

Другие вопросы по теме