使用Kotlin协程将Java线程处理消息转换为队列

时间:2019-01-16 10:33:28

标签: android multithreading retrofit2 messaging 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 个答案:

答案 0 :(得分:0)

可以声明用于同步或异步执行的改造方法

  call.execute();

是一个同步网络通话,0

通过定义返回类型来声明同步请求。同步方法在主线程上执行。这意味着UI在请求执行期间阻塞,并且在此期间无法进行交互。在调用对象上使用.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) {

}