1

私はネットワーククイズに取り組んでおり、スレッドからのアクティビティの処理の問題に直面しています。Clientこれは、 (正常に)サーバーに接続するための私のコードです:

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


    }

}

このsetQuestion(...)メソッドは で呼び出され、MainActivity質問と回答ボタンのキャプションが文字列に設定されます。私のコメントが示すように、スレッドが開始される前は機能しますが、スレッドが開始されるとクラッシュします。

これは私のsetQuestion(...)方法で、次の場所にありますMainActivity

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

2 に答える 2

0

あなたの handleMessage() は、メインの UI スレッドではなく、新しいスレッドから呼び出されています。このような場合は、AsyncTask の使用を検討してください。それがクリーンな方法です。

于 2013-11-02T19:21:45.673 に答える
0

スレッドから ui を更新することはできません。setQuestionがスレッドから呼び出され、setQuest でテキストをボタンに設定します。

スレッド @ の下のトピックを確認してください

http://developer.android.com/guide/components/processes-and-threads.html

HandlerまたはAsynctaskまたはを使用できます。runOnUiThread

activity.runOnUiThread(new Runnable() {
public void run() {
    activity.setQuestion("Question", "A", "B", "C", "D", 1);
 }
}
于 2013-11-02T19:23:36.287 に答える