我的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.
}
}
}
}
答案 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) {
}