android线程和处理程序 - 从后台线程更改UI对象

时间:2014-01-31 16:42:26

标签: java android multithreading handler

我最近编写了一个小型的Android应用程序来通过本地网络发送和接收UDP消息。
我有一个UDP接收器线程运行来监听UDP数据包,我想要发生的是一个按钮当收到包含特定数据字符串的数据包时,在UI上启用。我知道这必须通过一个处理程序来完成,问题在于我对线程有很少的了解,而且对处理程序知之甚少。
有人能够阐明如何将处理程序放入我的代码中吗?
感谢

代码:

public void startUDPlistener() {

    // Creates the listener thread
    LISTEN = true;
    Thread listenThread = new Thread(new Runnable() {

        @Override
        public void run() {

            try {

                Log.i(LOG, "Listener started!");
                DatagramSocket socket = new DatagramSocket(BROADCASTPORT);
                socket.setSoTimeout(1500);
                byte[] buffer = new byte[BUFFERSIZE];
                DatagramPacket packet = new DatagramPacket(buffer, BUFFERSIZE);


                while(LISTEN) {

                    try {

                        Log.i(LOG, "Listening for packets");
                        socket.receive(packet);
                        String data = new String(buffer, 0, packet.getLength());
                        Log.i(LOG, "UDP packet received from "+ packet.getAddress() +" packet contents: " + data);




                    }
                    catch(IOException e) {

                        Log.e(LOG, "IOException in Listener " + e);
                    }
                }

                Log.i(LOG, "Listener ending");
                socket.disconnect();
                socket.close();
                return;
            }

            catch(SocketException e) {

                Log.e(LOG, "SocketException in Listener " + e);

            }
        }
    });

    listenThread.start();

}

1 个答案:

答案 0 :(得分:1)

您基本上只需添加一个并发送MessageRunnable

private final Handler mUiThreadHandler = new Handler(Looper.getMainLooper());

void fromAnyThread() {
    final String importantDataFromBackGroundThread = "!!!";
    mUiThreadHandler.post(new Runnable() {
        @Override
        public void run() {
            System.out.println("Hi from Ui Thread:" + importantDataFromBackGroundThread);
        }
    });
}

Handler处理它运行的Thread中的所有消息/ runnable。如果指定Looper.getMainLooper(),则保证这是主线程。