目前我正在使用以下主题发送和接收我的自定义数据包:
public class DataTransferThread extends HandlerThread {
private static final String TAG = "DataTransferThread";
private SafeHandler handler;
private OnPacketReceiveListener pktRecvListener;
public interface OnPacketReceiveListener {
void onPacketReceive(Packet pkt);
}
public DataTransferThread(OnPacketReceiveListener pktRecvListener) {
super(TAG);
this.pktRecvListener = pktRecvListener;
}
@Override
protected void onLooperPrepared() {
super.onLooperPrepared();
handler = new SafeHandler(pktRecvListener, getLooper());
}
public void send(Packet pkt) {
handler.obtainMessage(SafeHandler.MSG_SEND, pkt).sendToTarget();
}
public void recv(Packet pkt) {
handler.obtainMessage(SafeHandler.MSG_RECV, pkt).sendToTarget();
}
private static class SafeHandler extends Handler {
private static final int MSG_SEND = 1;
private static final int MSG_RECV = 2;
private WeakReference<BluetoothManager> manager;
private WeakReference<OnPacketReceiveListener> pktRecvListener_;
// Debug fields
private int recvCnt = 0;
private int sendCnt = 0;
private SafeHandler(OnPacketReceiveListener pktRecvListener_, Looper looper) {
super(looper);
this.pktRecvListener_ = new WeakReference<>(pktRecvListener_);
manager = new WeakReference<>(BluetoothManager.getInstance());
}
@Override
public void handleMessage(Message msg) {
Packet pkt = null;
switch (msg.what) {
case MSG_SEND:
pkt = (Packet)msg.obj;
manager.get().sendToRemote(pkt.toBytes());
break;
case MSG_RECV:
pkt = (Packet)msg.obj;
pktRecvListener_.get().onPacketReceive(pkt);
break;
default:
break;
}
}
}
}
此线程中的方法send()和recv()可能会被其他不同的线程同时调用。我想知道Android的MessageQueue是否是线程安全的?如果没有,必须将锁添加到这两种方法中,对吗?