Android MessageQueue线程安全吗?

时间:2016-12-09 09:29:49

标签: android thread-safety message-queue

目前我正在使用以下主题发送和接收我的自定义数据包:

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是否是线程安全的?如果没有,必须将锁添加到这两种方法中,对吗?

0 个答案:

没有答案