2012-05-16 5 views
6

Ich möchte einen Toast anzeigen, sobald die Nachricht an einen Socket gesendet wird. Danach "Log.d (" ClientActivity "," C: Sent. ");"Wie kann man einen Toast in einem Handler/Thread anzeigen?

Ob ich einen separaten Thread erstellen muss, um Toast anzuzeigen?

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

}

Antwort

17

setzen

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

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

nach dieser Zeile

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

Es ist noch zu erklären und initialisieren wirft eine Fehlermeldung "Die Methode makeText (Context, CharSequence, int) im Typ Toast ist nicht anwendbar für die Argumente (new Runnable() {}, String, int)" – Shan

+0

Was ist der Fehler? – 5hssba

+0

Der Fehler – Shan

1

zunächst eine globale Handler deklarieren,

Handler handler=null; 

Dann einen Handler in Ihrer onCreate Create() wie folgt aus,

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

} 
}; 

Und jetzt in Ihrer Runnable-Klasse diese Zeile nach "Log.d("ClientActivity", "C: Sent.");"

handler.sendEmptyMessage(0); 

Das Problem Sie konfrontiert sind hinzufügen, weil Sie nicht können Aktualisiere UI von Runnable. Handler verbinden Sie mit Ihrer Hauptbenutzeroberfläche. Sie müssen also Ihrem Handler eine Nachricht von Ihrem Runnable geben.

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

Wenn der Kontext eine Aktivität ist (wie Sie mit YourActivity.this angedeutet haben), können Sie einfach runOnUiThread() verwenden, richtig? –

+0

@DavidDoria Sie haben Recht, als Handler ist nur zu tun, irgendwelche Ui Änderungen und wenn Sie runOnUiThread-Methode Implementierung sehen, überprüft es zuerst aktuelle Thread ist ui Thread oder nicht und wenn aktuelle Thread ist nicht ui thread dann Aufgabe im Handler gegeben . – itechDroid

+0

Denken Sie daran, .show() für den erstellten Toast aufzurufen. –

2

Sie können keinen Toast innerhalb eines Threads erstellen. Weil dieser neue Thread keinen Zugriff auf die getApplicationContext() hat, die Sie an ihn weitergeben. Sie müssen irgendwie eine Kommunikation mit dem UI-Thread (d. H. Dem Haupt-Thread) einrichten.
Also wann immer Sie etwas Toast wollen, tun Sie es in der handler.Post(Runnable) Methode. Handler ist die middle man zwischen dem UI-Thread und dem separaten Thread, den Sie ausführen. Alle UI-Operationen müssen unter handler.Post(Runnable)s run() Methode durchgeführt werden.

So in Ihrer Tätigkeit einen Toast tut dies anzuzeigen:

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

Vergessen Sie nicht, ein Handler-Objekt in Ihrer Haupttätigkeit (außerhalb des Threads)

handler=new Handler(); 
Verwandte Themen