Преобразование сообщений обработки Java-потока в очередь с использованием Kotlin Coroutines - PullRequest
0 голосов
/ 16 января 2019

В моем 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 Ответ

0 голосов
/ 16 января 2019

Методы модификации могут быть объявлены для синхронного или асинхронного выполнения

  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) {

}
...