Вложенный запрос в сети
Сначала я объясню, что такое вложенный запрос в сети. Некоторые студенты не сталкивались с такой потребностью. Существует один бизнес-процесс, который требует запроса двух интерфейсов. Только после того, как оба интерфейса будут полностью запрошены, можно обновить данные пользовательского интерфейса (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 )