2017-12-18 15 views
0

私は、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()このスレッドでは呼び出されませんでした。

答えて

0

代わりのactivity.handleMessage(messageStr);あなたはのhandleMessageがループ内で実行されますので、ハンドラへのメッセージとして送信する必要があります。

Bundle data = new Bundle(); 
data.putString("MESSAGE_KEY", messageStr); 
Message msg = new Message(); 
msg.setData(data); 
activity.sendMessage(msg); 

だから、あなたはまだ同じエラーをmessage.getData().getString("MESSAGE_KEY");

+0

それは今働いています良いですが、UIで何かを行うハンドラからメソッドを呼び出す方法を見つけることができません。 –

+0

@VasconcelosMarcos –

+0

これは、ハンドラを作成する場所によって異なります。アクティビティの子クラスでも外部クラスはまだアクセスできません。 handleMessage実装のビューに触れます。 –

0

UIスレッドをハンドラー内で作成し、UI操作を実行しようとします。

new Handler(Looper.getMainLooper()) { 
    @Override 
    public void handleMessage(Message message) { 
     // This is where you do your work in the UI thread. 
     // Your worker tells you in the message what to do. 
    } 
}; 
+0

を取得してください:( –

+0

は答えを更新しました文字列を抽出するために、ハンドラののhandleMessageにメッセージを受け取ることになります。今それを試してみてください。 –