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);
 }
}