私はネットワーククイズに取り組んでおり、スレッドからのアクティビティの処理の問題に直面しています。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;
}