更新线程内的UI(Android Studio / JAVA)

问题描述 投票:0回答:2

我正在通过Android上的套接字创建一个小型游戏。在接收线程的客户端上,我正在侦听来自其他设备的消息:

class ReceivingThread implements Runnable {
        @Override
        public void run() {

            BufferedReader input;
            try {
                input = new BufferedReader(new InputStreamReader(mSocket.getInputStream()));
                while (!Thread.currentThread().isInterrupted()) {

                    final String messageStr = input.readLine();
                    if (messageStr != null) {

                        activity.runOnUiThread(new Runnable() {
                            public void run() {
                                Toast.makeText(activity, messageStr, Toast.LENGTH_LONG).show();
                                activity.handleMessage(messageStr);
                            }
                        });
                    } else {
                        break;
                    }
                }
                input.close();

            } catch (IOException e) {
            }
        }
    }

吐司显示的信息很好,但应用程序崩溃在activity.handleMessage()。这就是该方法的作用(仅将其切割为一种情况,仅用于方法的点):

public void handleMessage(String msg){
    switch(msg){
        case "1":
            Button temp = (Button) findViewById(btn1);
            if(isOwner) {
                temp.setText("O");
            } else {
                temp.setText("X");
            }
            temp.setEnabled(false);
            break;
        case "You Lose":
            TextView textBox = (TextView) findViewById(R.id.textBox);
            textBox.setText("You Lose!");
    }
}

我得到的信息是:

在这个线程上没有调用java Looper.prepare()。

java android multithreading user-interface
2个回答
0
投票

您需要将它作为消息发送给处理程序,而不是activity.handleMessage(messageStr);,因此handleMessage将在循环中执行。

 Bundle data = new Bundle();
 data.putString("MESSAGE_KEY", messageStr);
 Message msg = new Message();
 msg.setData(data);
 activity.sendMessage(msg);

因此,您将在Handler的handleMessage中收到Message,以提取您执行message.getData().getString("MESSAGE_KEY");的String


0
投票

在处理程序内创建UI线程并尝试执行UI操作。

new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message message) {
        // This is where you do your work in the UI thread.
        // Your worker tells you in the message what to do.
    }
};
© www.soinside.com 2019 - 2024. All rights reserved.