我正在通过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()。
您需要将它作为消息发送给处理程序,而不是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
在处理程序内创建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.
}
};