私は、Android上でwifi-direct経由で小さなゲームを作成しています。クライアントの受信スレッドに私は他のデバイスからのメッセージを聞いています:スレッド内のUIを更新する(Androidスタジオ/ JAVA)
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()
にクラッシュします。これは、メソッドが何をするかである(ちょうどメソッドのポイントのために、ただ1つのケースを、それを切り倒し):
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()このスレッドでは呼び出されませんでした。
それは今働いています良いですが、UIで何かを行うハンドラからメソッドを呼び出す方法を見つけることができません。 –
@VasconcelosMarcos –
これは、ハンドラを作成する場所によって異なります。アクティビティの子クラスでも外部クラスはまだアクセスできません。 handleMessage実装のビューに触れます。 –