2010-11-17 6 views
11

Mi aplicación inicia un hilo para consultar algunos datos en la web. Quiero mostrar un mensaje de Toast cuando no se encuentra nada, pero mi aplicación siempre se cuelga.Publicación del mensaje Toast from a Thread

He intentado usar el contexto de aplicación desde el interior de la rosca, así:

Toast.makeText(getApplicationContext(), "testttt", Toast.LENGTH_LONG).show(); 

He intentado también la creación de un Ejecutable con el llamado pan tostado y llamando runOnUiThread (ejecutable) de la rosca (la Toast call en este ejecutable usa la actividad como el primer parámetro).

¿Alguien tiene alguna idea sobre cómo lograr esto?

+0

¿Está usando 'Thread' como una clase interna o estás extendiendo 'AsyncTask' en una clase totalmente separada? –

+0

Por el momento estoy usando una clase que amplié desde Thread. Es probable que cambie esto a una AsyncTask en algún momento. Simplemente no he llegado a eso todavía. – Andrew

Respuesta

22

tratar de publicar en el interior de un objeto Handler.

final Handler mHandler = new Handler(); 
final Runnable mUpdateResults = new Runnable() { 
    public void run() { 
     Toast(this, message, duration).show(); 
    } 

new Thread() { 
    public void run() { 
     mHandler.post(mUpdateResults); 
    } 
}.start(); 
4

Toast.makeText().show() definitivamente necesita ejecutarse en el hilo de la interfaz de usuario.

Probablemente debería utilizar un AsyncTask como Octavio Damiean mencionó, pero aquí hay un código usando runOnUiThread si ya estás en el uso de lo siguiente:

public void showToastFromBackground(final String message) { 
    runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
     } 
    }); 
} 
+0

Como mencioné en mi publicación original, lo he intentado y se cuelga – Andrew

+2

Publica el seguimiento de la pila en tu publicación original. –

+0

en el código anterior al primer parámetro "esto" es probablemente incorrecto, debe pasar un contexto válido explícitamente, f.i. su ProgressDialog.getContent() –

1

Si se está utilizando el controlador de su clase de actividad, puede establecer el contexto con sólo hacer referencia a los .this de su actividad, así:

final Runnable showToastMessage = new Runnable() { 
    public void run() { 
     Toast.makeText(YourActivity.this, "Message", Toast.LENGTH_SHORT).show(); 
    } 
};