Преобразование сообщений обработки потоков Java в очередь с использованием Kotlin Coroutines
В моем приложении для Android есть выделенная нить, которая выполняет сетевые вызовы API с использованием дооснащения. Поток выполняет дооснащение API-вызовов в зависимости от типа полученного сообщения. Я хотел бы перенести этот код для использования сопрограмм Kotlin, но я не уверен, как реализовать очереди сообщений без использования потока. Любая помощь будет оценена.
Псевдо-Java-код:
открытый класс MyThread расширяет тему {
private final Messenger mPushMessenger;
private Handler mHandler;
private Object mThreadLock;
private IMessage mMessage;
private MyThread(IMessage message) {
super(message.getThreadLink().name());
mMessage = message;
start();
mPushMessenger = new Messenger(getHandler());
mThreadLock = new Object();
}
public static MyThread getInstance(IMessage ISenThread)
{
return new MyThread(ISenThread);
}
public void NotifyThreadLock() {
synchronized (mThreadLock)
{
try {
mThreadLock.notify();
}
catch(Exception e)
{
}
}
}
private Handler getHandler() {
synchronized (this) {
while (mHandler == null) {
try {
wait();
} catch (InterruptedException ignored) {
}
}
}
return mHandler;
}
public void run() {
Looper.prepare();
synchronized (this) {
mHandler = new MyThread().MyHandler();
notifyAll();
}
Looper.loop();
}
public void pushMessage(Object message, int what) {
try {
android.os.Message msg = android.os.Message.obtain(null, what, message);
mPushMessenger.send(msg);
} catch (Exception ignored) {
}
}
public void EmptyQueue() {
}
/*
public void pushMessage(String message) {
pushMessage(message, SenFCMLink.SenEyeStatusSender.STATUS_GENERAL_MESSAGE);
}
* /
private class MyHandler extends Handler {
public void handleMessage(Message msg) {
switch(msg.Type)
{
case A:
// call retrofit API Method A
case B:
// call retrofit API Method B
case C:
// call retrofit API method C.
}
}
}
}
1 ответ
Методы модернизации могут быть объявлены для синхронного или асинхронного выполнения.
call.execute();
синхронный сетевой вызов,0
Синхронные запросы объявляются путем определения типа возврата. Синхронные методы выполняются в основном потоке. Это означает, что пользовательский интерфейс блокируется во время выполнения запроса, и в этот период взаимодействие невозможно. Использование метода.execute() для объекта вызова будет выполнять синхронный запрос. Десериализованное тело ответа доступно через метод.body() объекта ответа.
call.enqueue()
это асинхронный сетевой вызов, асинхронные запросы не имеют типа возврата. Вместо этого определенный метод требует типизированного обратного вызова в качестве последнего параметра метода. Использование асинхронных запросов вынуждает вас реализовать Обратный вызов с двумя его методами обратного вызова: успех и сбой. При вызове асинхронного метода getTasks() из класса обслуживания вы должны реализовать новый Callback и определить, что следует делать после завершения запроса.
как ниже:
call.enqueue(new Callback<Object>() {
@Override
public void onResponse(Call<Object> call, Response<Object> response) {
response = response.body();
}
@Override
public void onFailure(Call<Object> call, Throwable t) {
}