如何在循环中重复使用相同的 java 消息参数

How to re-use the same java Message parameters in a loop

我需要一个运行接收 UDP 数据的线程的服务,然后使用处理程序将此数据发送到 Activity。我的代码有时可以工作,但有时它会因为某种原因而失败,我无法欣赏调试。

服务中的线程运行

public void run() {
        //UDP initialize
        while (true) {
            //receive UDP packet
            //set Message obj and what values
            //send Message to handler
        }
}

Activity

protected void onCreate(Bundle savedInstanceState) {
    //Obtain Message from handler
}

你一直重复使用同一个 Message 对象,基本上覆盖了已经排队的对象中的数据,并一遍又一遍地重新排队同一个对象。

此代码错误:

    Message msgToActivity = new Message();
    DatagramPacket packetIn = new DatagramPacket(receiveData, receiveData.length);
    while (true) {
        receiveSocket.receive(packetIn);
        msgToActivity.obj = new String(receiveData, 0, packetIn.getLength());
        msgToActivity.what = 0;
        LogComActivity.logcomHandler.sendMessage(msgToActivity);
    }

您正在创建单个 Message 对象,然后对其进行修改并在循环中排队。

改为这样做:

    DatagramPacket packetIn = new DatagramPacket(receiveData, receiveData.length);
    while (true) {
        receiveSocket.receive(packetIn);
        Message msgToActivity = Message.obtain();
        msgToActivity.obj = new String(receiveData, 0, packetIn.getLength());
        msgToActivity.what = 0;
        LogComActivity.logcomHandler.sendMessage(msgToActivity);
    }

此代码每次在循环内获取一个新的 Message 对象,但从全局回收对象池中请求 Message 对象,而不是每次都创建一个新对象。


此外,此调用(在 handleMessage()) 内:

this.obtainMessage();

没有用,因为您没有对返回的 Message 对象做任何事情。你不需要那个代码。删除它。