如何从另一个线程更新View

时间:2014-01-24 15:59:22

标签: android multithreading view udp

我有一个正在接收数据包的UDPServer,代码在下面。基本上当收到数据包时会发生什么,切换按钮应该被打开。确实如此,但只有在我旋转手机或按菜单按钮时才会更新视图。我认为这是由于视图没有被重新绘制。我也觉得这与事实有关,我正在使用一个线程,并且这是一个无限循环,不知何故,UI线程永远不会看到invalidate()来刷新视图。 UDPServer应该使用异步任务吗?不确定这是否是实现UDPServer的最佳方式。

public class UDPServer extends Thread {
    public static final int SERVERPORT = 4444;
    private boolean isRunning = false;
    private String lastMessage = "";

    /**
     * Method to send the messages from server to client
     * 
     * @param message
     *            the message sent by the server
     */
    public void sendMessage(String message) {
    }

    @Override
    public void run() {
        super.run();
        isRunning = true;
        String message;
        byte[] lmessage = new byte[4096];
        DatagramSocket socket = null;
        DatagramPacket packet = new DatagramPacket(lmessage,
                lmessage.length);
        // Let the server continue to listen for incoming packets
        // Will listen on localhost and port 4444 for now
        while (isRunning) {
            try {
                InetAddress serverAddr = InetAddress
                        .getByName("192.168.1.107");
                socket = new DatagramSocket(SERVERPORT, serverAddr);
                socket.receive(packet);
                ToggleButton tglBtn = (ToggleButton) findViewById(R.id.toggleButton1);
                tglBtn.setChecked(true);
                // Get the data from the packet and react accordingly
                message = new String(lmessage, 0, packet.getLength());
                lastMessage = message;
                runOnUiThread(updateTextMessage);
                // processMessage(message);
                myView.invalidate();
            } catch (Throwable e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

2 个答案:

答案 0 :(得分:1)

您应该考虑使用AsyncTask;它就是为此而开发的。您在doInBackground()执行长时间运行的任务,该任务在后台Thread上运行,然后更新onPostExecute()中的用户界面,该用户界面在用户界面Thread上运行并获得结果从doInBackground()返回。

答案 1 :(得分:0)

要从非ui主题获取invalidate视图,您可以使用postInvalidate()