【发布时间】: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