2012-05-16 1 views
6

メッセージがソケットに送信されると、トーストを表示したい。 "Log.d(" ClientActivity "、" C:Sent。 ");"ハンドラー/スレッド内にトーストを表示するにはどうすればいいですか?

トーストを表示するために別のスレッドを作成する必要はありますか?

public class ClientActivity extends Activity { 
private Handler handler = new Handler(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.client); 
    serverIp = (EditText) findViewById(R.id.EditText01); 
    message =(EditText) findViewById(R.id.EditText02); 
    connectPhones = (Button) findViewById(R.id.Button01); 

} 

    public void Click1(View v) { 
     if (!connected) { 
      serverIpAddress = serverIp.getText().toString(); 
      if (!serverIpAddress.equals("")) { 
       Thread cThread = new Thread(new ClientThread()); 
       cThread.start(); 
      } 
     } 
    } 


private class ClientThread implements Runnable { 

    public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      Log.d("ClientActivity", "C: Connecting..."); 
      Socket socket = new Socket(serverAddr, ServerActivity.SERVERPORT); 
      connected = true; 
      while (connected) { 
       try { 
        if(i>5) 
        { 


        } 
        else 
        { 
         Log.d("ClientActivity", "C: Sending command."); 
         PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket 
           .getOutputStream())), true); 
         // where you issue the commands 
         message1= message.getText().toString(); 
         out.println(message1); 
         i=i+1; 
         Log.d("ClientActivity", "C: Sent."); 
        }  
       } catch (Exception e) { 
        Log.e("ClientActivity", "S: Error", e); 
       } 
      } 
      socket.close(); 
      Log.d("ClientActivity", "C: Closed."); 
     } catch (Exception e) { 
      Log.e("ClientActivity", "C: Error", e); 
      connected = false; 
     } 
    } 
} 

}

答えて

17

は、

Log.d("ClientActivity", "C: Connecting..."); 
+0

それはまだスローエラーメッセージ "Toast型のメソッドmakeText(Context、CharSequence、int)は引数には適用されません(新しいRunnable(){}、String、int)" – Shan

+0

エラーは何ですか? – 5hssba

+0

エラーを追加しました – Shan

1

は最初のグローバルハンドラを宣言し、この行の後

runOnUiThread(new Runnable() { 
       public void run() { 

        Toast.makeText(ClientActivity.this,"asdf",Toast.LENGTH_LONG).show(); 
       } 
      }); 

を入れ

Handler handler=null; 
このような

次に、あなたのonCreate(でハンドラを作成します)、あなたのRunnableクラスの

Handler handler=new Handler() 
{ 
    public void handleMessage(Message msg) 
{ 
    if(msg.what==0) 
{ 
    Toast.makeText(ClientActivity.this,"Your Toast Mesage Goes here",Toast.LENGTH_LONG).show(); 
} 

} 
}; 

そして今、あなたができないので、あなたが直面している問題がある"Log.d("ClientActivity", "C: Sent.");"

handler.sendEmptyMessage(0); 

後にこの行を追加します。実行可能ファイルからUIを更新します。ハンドラはメインUIに接続します。したがって、Runnableからハンドラにメッセージを渡す必要があります。

3
Handler handler=new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
     System.out.println("I'm in handler"); 
     Toast.makeText(YourActivity.this, "this is toast",Toast.LENGTH_SHORT); 
    } 
}, 1000);    
+1

コンテキストがアクティビティ(YourActivity.thisを暗示しているように)である場合は、runOnUiThread()を使用できますか? –

+0

@DavidDoriaあなたは正しいですが、ハンドラはUIの変更を行うためにのみ使用され、runOnUiThreadメソッドの実装が見えるときはまず現在のスレッドがUIスレッドかどうかをチェックし、現在のスレッドがUIスレッドでない場合はハンドラ。 – itechDroid

+0

作成したトーストで.show()を呼び出すことを忘れないでください。 –

2

スレッド内からトーストを作成することはできません。この新しいスレッドは、あなたが渡したgetApplicationContext()へのアクセス権を持っていないためです。 UIスレッド(つまり、メインスレッド)との通信をどうにかして行う必要があります。
トーストしたいときはいつでもhandler.Post(Runnable)メソッドで行います。ハンドラは、実行中のUIスレッドと別のスレッドの間のmiddle manです。すべてのUI操作はhandler.Post(Runnable)run()メソッドで行う必要があります。

だからあなたの活動でこれを行うトーストを表示するには:

private class ClientThread implements Runnable { 

    public void run() { 
     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      ..... 
      ..... 
       message1= message.getText().toString(); 
         out.println(message1); 
         i=i+1; 
         Log.d("ClientActivity", "C: Sent."); 
         handler.post(new Runnable(){ 
          public void run() 
          { 
          Toast.make(....); 
          } 
         }); 

は、(スレッドの外に)あなたの主な活動にハンドラオブジェクトを宣言して初期化することを忘れないでくださいを

handler=new Handler(); 
関連する問題