【问题标题】:Converting Java Thread processing messages to queue using Kotlin Coroutines使用 Kotlin 协程将 Java 线程处理消息转换为队列
【发布时间】:2019-01-16 10:33:28
【问题描述】:

我的 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.    
        }

    }

}

}

【问题讨论】:

  • 所以我假设在这个线程中您正在进行同步网络调用?发布你的这个线程的代码
  • 更新了java示例代码
  • Retrofit 方法可以声明为同步或异步执行,我认为 Retrofit 不需要线程,.

标签: android multithreading retrofit2 messaging kotlin-coroutines


【解决方案1】:

可以为同步或异步执行声明改造方法

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2011-09-27
    • 2017-11-12
    • 2012-12-08
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多