2012-05-16 19 views
6

Quiero mostrar un brindis una vez que el mensaje se envía a un socket. Después de esto "Log.d (" ClientActivity "," C: Enviado ");"¿Cómo mostrar un Toast dentro de Handler/thread?

Si necesito crear una secuencia separada para mostrar 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; 
     } 
    } 
} 

}

Respuesta

17

poner

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

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

después de esta línea

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

Todavía tiros un mensaje de error "El método makeText (Context, CharSequence, int) en el tipo Toast no es aplicable para los argumentos (new Runnable() {}, String, int)" – Shan

+0

¿cuál es el error? – 5hssba

+0

Agregué el error – Shan

1

declarar un manejador mundial en primer lugar,

Handler handler=null; 

a continuación, crear un controlador en su onCreate() como este,

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

} 
}; 

Y ahora en su clase Ejecutable añadir esta línea después de "Log.d("ClientActivity", "C: Sent.");"

handler.sendEmptyMessage(0); 

El problema que se enfrentan es porque no se puede actualizar la interfaz de usuario de Runnable. Los manejadores lo conectan a su interfaz de usuario principal. Por lo tanto, debe pasar un mensaje a su controlador desde 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

Si el contexto es una Actividad (como ha implicado con YourActivity.this) puede simplemente usar runOnUiThread(), ¿verdad? –

+0

@DavidDoria tienes razón, como el manejador solo se usa para hacer cambios en la interfaz de usuario y cuando ves la implementación del método runOnUiThread, primero comprueba si el hilo actual es ui thread y si el hilo actual no es ui thread entonces realiza la tarea especificada en handler . – itechDroid

+0

Recuerde llamar .show() en el Toast creado. –

2

No se puede crear un brindis dentro de un hilo. Porque este nuevo hilo no tiene acceso al getApplicationContext() que le pasa. De alguna manera tiene que establecer una comunicación con el hilo de la interfaz de usuario (es decir, el hilo principal).
Entonces, cuando quiera brindar algo, hágalo en el método handler.Post(Runnable). Handler es middle man entre el subproceso de interfaz de usuario y el subproceso independiente que está ejecutando. Todas las operaciones de UI deberán realizarse en el método handler.Post(Runnable) .

Así que en su actividad para mostrar un brindis hacer esto:

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

No olvide declarar e inicializar un objeto manejador en su actividad principal (fuera de la rosca)

handler=new Handler(); 
Cuestiones relacionadas