2012-05-16 11 views
6

Chcę wyświetlić toast po wysłaniu wiadomości do gniazda. Po tym "Log.d (" CustomerActivity "," C: Sent. ");"Jak wyświetlić toast wewnątrz uchwytów/wątku?

Czy muszę utworzyć oddzielny wątek, aby wyświetlić toast?

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

}

Odpowiedz

17

umieścić

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

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

po tej linii

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

Nadal rzuca:

Więc w swojej działalności, aby wyświetlić toast to zrobić komunikat o błędzie "Metoda makeText (Context, CharSequence, int) w typie Toast nie ma zastosowania dla argumentów (new Runnable() {}, String, int)" – Shan

+0

jaki jest błąd? – 5hssba

+0

Dodano błąd – Shan

1

oświadczam, pierwszy globalny Handler,

Handler handler=null; 

następnie utworzyć obsługi w onCreate() jak ten,

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

} 
}; 

A teraz w swojej klasie Runnable dodać ten wiersz po "Log.d("ClientActivity", "C: Sent.");"

handler.sendEmptyMessage(0); 

Problem stoją dlatego nie można zaktualizuj interfejs użytkownika z działającego. Handlowcy łączą Cię z głównym interfejsem użytkownika. Musisz przekazać wiadomość swojemu przewodnikowi z 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

Jeśli kontekst jest działaniem (jak sugerujesz w YourActivity.this), możesz po prostu użyć funkcji runOnUiThread(), prawda? –

+0

@DavidDoria masz rację, jako że obsługa jest użyta tylko do wykonania dowolnych zmian Ui i kiedy zobaczysz implementację metody runOnUiThread, najpierw sprawdza bieżący wątek jest wątkiem Ui lub nie i jeśli bieżący wątek nie jest wątkiem UI, to robi to zadanie w programie obsługi . – itechDroid

+0

Pamiętaj, aby wywołać funkcję .show() na utworzonej toście. –

2

Nie można utworzyć grzanki z wewnątrz nici. Ponieważ ten nowy wątek nie ma dostępu do getApplicationContext(), które mu przekazujesz. W jakiś sposób musisz establesh komunikować się z wątkiem UI (to znaczy głównym wątkiem).
Więc kiedy chcesz toast, rób to w metodzie handler.Post(Runnable). Handler to middle man między wątkiem interfejsu użytkownika i oddzielnym wątkiem, którego używasz. Wszystkie operacje w interfejsie użytkownika będą musiały być wykonane w metodzie '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(....); 
          } 
         }); 

Nie zapomnij zadeklarować i zainicjować obiektu uchwytu w swojej głównej działalności (poza gwintem)

handler=new Handler(); 
Powiązane problemy