1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/ClAndEllen-EasyChat

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Вложенный запрос в сети

Сначала я объясню, что такое вложенный запрос в сети. Некоторые студенты не сталкивались с такой потребностью. Существует один бизнес-процесс, который требует запроса двух интерфейсов. Только после того, как оба интерфейса будут полностью запрошены, можно обновить данные пользовательского интерфейса (UI). Более того, параметры второго запроса интерфейса зависят от параметров первого запроса.

RxJava, похоже, не очень хорошо справляется с этой задачей. Однако эта библиотека может полностью удовлетворить требования последовательных запросов. Далее мы рассмотрим простой пример. Например, я хочу преобразовать данные типа Byte в тип Integer, а затем в String. Это похоже на вложенное сетевое требование. Пример кода:

final byte data = 3;
new Sender<Integer>() {
    @Override
    protected void handlerInstruction(SenderController<Integer> senderController) {
        Integer data1 = new Integer(data);
        senderController.sendMessageToNext(data1);
    }
}
.runOn(RunMode.REUSABLE_THREAD)
.setMessenger(new Messenger<Integer,String>() {

    @Override
    protected void handleMessage(MessengerSender<String> messengerSender, Integer receiverMessage) {
        messengerSender.sendMessageToNext(String.valueOf(receiverMessage));
    }

    @Override

protected void handleErrMessage(MessengerSender messengerSender, Throwable throwable) {

} }) .runOn(RunMode.REUSABLE_THREAD) .setReceiver(new Receiver() { @Override protected void handleMessage(String message) { Log.e("Ellen2018","收到消息:"+message); }

@Override
protected void handleErrMessage(Throwable throwable) {

}

@Override
protected void complete() {

}

}) .runOn(RunMode.MAIN_THREAD) .start();

Сценарий 3: требуется запросить три интерфейса для обновления UI (параллельно)

new ParallelMessageManager() .addParallelSender(new ParallelSender("Задача 1") { @Override protected void handlerInstruction(ParallelSenderControl senderControl) { // Запрос интерфейса 1... String json1 = "Данные запроса сетевого интерфейса 1"; senderControl.sendCompleteMessage(json1); } }).setReTryTime(5)// Можно установить количество попыток при ошибке задачи, это очень удобно, ха-ха (вызов senderControl.sendErrMessageToNext(...) вызовет повторную попытку) .addParallelSender(new ParallelSender("Задача 2") { @Override protected void handlerInstruction(ParallelSenderControl senderControl) { // Запрос интерфейса 2... String json2 = "Данные запроса сетевого интерфейса 2"; senderControl.sendCompleteMessage(json2); } }).addParallelSender(new ParallelSender("Задача 3") { @Override protected void handlerInstruction(ParallelSenderControl senderControl) { // Запрос интерфейса 3... String json3 = "Данные запроса сетевого интерфейса 3"; senderControl.sendCompleteMessage(json3); } }).setParallelReceiver(new ParallelReceiver() { @Override public void handleMessage(ParallelSender parallelSender, Object message) { // Каждый раз, когда вышестоящий уровень отправляет сообщение, этот метод будет вызываться }

        @Override
        public void handleErrMessage(ParallelSender parallelSender, Throwable throwable) {
            // Каждый раз, когда вышестоящий уровень отправляет ошибочное сообщение, этот метод будет вызываться
        }

        @Override
        public void handleComplete(ParallelSender parallelSender, ParallelMessgengrHandler.TaskProgress taskProgress, Object message) {
            // Вышестоящий уровень каждый раз отправляет полное сообщение, которое вызывает этот метод

            // 1. Как получить прогресс запроса
            String jinDu = taskProgress.getCurrentProgress()+"/"+taskProgress.getTotalProgress();

            // 2. Как получить отправленное сообщение и обработать его
            String json = (String) message;
            // Обратите внимание на различие тегов
            if(parallelSender.getTag().equals("Задача 1")){
                // Логика успешного запроса Json для задачи 1
            }else if(parallelSender.getTag().equals("Задача 2")){
                // Логика успешного запроса Json для задачи 2
            }else if(parallelSender.getTag().equals("Задача 3")){
                // Логика успешного запроса Json для задачи 3
            }
        }
    })
            // Заставить обработку Receiver полностью выполняться в основном потоке (поток пользовательского интерфейса)
            .runOn(RunMode.MAIN_THREAD)
            // Не забудьте вызвать start
            .start(); Код на самом деле очень простой. Через ParallelMessageManager непрерывно вызывается addParallelSender для добавления параллельных задач.

Обратите внимание, что у конструктора ParallelSender есть два варианта: пустой конструктор и конструктор с параметром String. Поскольку задача должна иметь тег, чтобы в дальнейшем ParallelReceiver мог различать, какая задача выполнена и какое сообщение было отправлено, рекомендуется при отправке задачи присваивать ей тег.

Также следует отметить, что выполнение задачи связано с методом handlerInstruction(ParallelSenderControl senderControl) класса ParallelSenderControl. Только когда ParallelSenderControl вызывает метод sendCompleteMessage(Object message), это означает, что текущая задача завершена.

API для параллельной работы также поддерживает перехватчики, но только один перехватчик. Что касается получателя, то не стоит подробно описывать значение трёх его методов.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Создать набор простых в использовании и легко понимаемых асинхронных коммуникационных фреймворков. Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/ClAndEllen-EasyChat.git
git@api.gitlife.ru:oschina-mirror/ClAndEllen-EasyChat.git
oschina-mirror
ClAndEllen-EasyChat
ClAndEllen-EasyChat
master