Java 线程中的处理活动
我正在做一个网络测试,遇到了从线程处理活动的问题。这是我为成功连接到服务器的客户端编写的代码:Java 线程中的处理活动,java,android,multithreading,Java,Android,Multithreading,我正在做一个网络测试,遇到了从线程处理活动的问题。这是我为成功连接到服务器的客户端编写的代码: public class Client extends Thread { private MainActivity activity; private Socket socket; private DataInputStream dataIn; private DataOutputStream dataOut; private String host;
public class Client extends Thread {
private MainActivity activity;
private Socket socket;
private DataInputStream dataIn;
private DataOutputStream dataOut;
private String host;
private int port;
public Client(String host, int port, MainActivity activity) {
this.host = host;
this.port = port;
this.activity = activity;
// At this point of the code, it works just great:
activity.setQuestion("Question", "A", "B", "C", "D", 1);
this.start();
}
private void processMessage( String msg ) {
try {
dataOut.writeUTF(msg);
} catch (IOException e) {
System.out.println(e);
}
}
void handleMessage(String msg) {
if (msg.equals("changeQuestion")) {
// This does not work:
activity.setQuestion("Question", "A", "B", "C", "D", 1);
}
}
@Override
public void run() {
try {
socket = new Socket( host, port );
dataIn = new DataInputStream( socket.getInputStream() );
dataOut = new DataOutputStream( socket.getOutputStream() );
while (true) {
String msg = dataIn.readUTF();
handleMessage(msg);
}
} catch (IOException e) {
System.out.println(e);
}
}
}
这个问题。。。方法在MainActivity中调用,其中问题和答案按钮的标题设置为字符串。
正如我的评论所告诉您的,在线程启动之前,它确实可以工作,但是一旦线程启动,它就会崩溃
这是我的问题。。。方法,该方法位于主活动中:
正在从新线程而不是主UI线程调用handleMessage。考虑使用asycTebug这样的事情。这是干净的方法。不可能从线程更新ui。setQuestion从线程调用,您可以在setQuestion中将文本设置为按钮 检查线程下的主题@ 您可以使用处理程序、Asynctask或runOnUiThread
您不能从线程更新ui谢谢。那么,我会找到另一个解决方案。您可以使用runOnUiThread,这是活动类的一种方法。检查我的帖子,我知道。然而,我认为,我可以从线程内部更新UI,这似乎是非法的。不过,谢谢你。是的,不要这样做——如果它看起来有效,它可能会偶尔出现故障。这很容易!谢谢你,刚好满足我的需要!
public void setQuestion(String Q, String A, String B, String C, String D, int correctAnswer) {
TextView tvQuestion = (TextView) findViewById(R.id.tvQuestion);
tvQuestion.setText("");
Button btnA = (Button) findViewById(R.id.btnAnswerA);
Button btnB = (Button) findViewById(R.id.btnAnswerB);
Button btnC = (Button) findViewById(R.id.btnAnswerC);
Button btnD = (Button) findViewById(R.id.btnAnswerD);
tvQuestion.setText(Q);
btnA.setText(A);
btnB.setText(B);
btnC.setText(C);
btnD.setText(D);
this.correctAnswer = correctAnswer;
}
activity.runOnUiThread(new Runnable() {
public void run() {
activity.setQuestion("Question", "A", "B", "C", "D", 1);
}
}