Android – llamando al hilo de ui del hilo de trabajo

Hola Quiero hacer Toast disponible para mí no importa qué y disponible de cualquier hilo cuando quiera dentro de mi aplicación. Así que para hacer esto amplié la clase de Activity :

 import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.widget.Toast; public class MyActivity extends Activity{ private Handler mHandler; @Override public void onCreate(Bundle savedInstanceState) { mHandler = new Handler(); super.onCreate(savedInstanceState); } private class ToastRunnable implements Runnable { String mText; public ToastRunnable(String text) { mText = text; } public void run(){ Toast.makeText(getApplicationContext(), mText, Toast.LENGTH_SHORT).show(); } } public void doToast(String msg) { mHandler.post(new ToastRunnable(msg)); } } 

De modo que todas las clases de Activity en mi aplicación sean ahora simplemente

 public class AppMain extends MyActivity { //blah } 

Lo que esperaba poder hacer (en un hilo de trabajo) era esto:

 try{ MyActivity me = (MyActivity) Looper.getMainLooper().getThread(); me.doToast("Hello World"); } catch (Exception ex){ Log.e("oh dear", ex.getMessage()); } 

Y siempre y cuando la Activity fuera una " MyActivity " debería funcionar – pero el problema es —> Looper.getMainLooper().getThread(); No está devolviendo MyActivity a mí y me está haciendo llorar – ¿qué estoy haciendo mal?

: EDIT:

Algunos antecedentes para explicar "por qué" estoy atrapado con este tipo de implmentación.

Necesito ser capaz de confirmar al usuario que un "HTTP POST" evento ha sido un éxito. Ahora. Si el usuario hace clic en "Aceptar" en el formulario de interfaz de usuario puede o no puede tener Internet en ese momento .. Si tiene Internet – todo bien y bueno – publica el formulario a través de HTTP POST todo bien y bien .. pero si hay NO Internet la mayoría (99,999% de las aplicaciones de Android cojo / patético / mewling en esto, y, básicamente, ofrecer al usuario ningún plan "b" asumiendo que en todo momento el Internet está allí – cuando no es)

Mi aplicación no va a "cojo (como lo llamo)" – tiene un plan "b" en lugar de "colas" el evento de post y vuelve a intentar cada x minutos .. ahora este es un hilo en silencio en el fondo .. I Tengo un montón de interacción del usuario en toda la aplicación no sé dónde el usuario "estará", pero finalmente cuando el HTTP POST que cola / reintentos / cola / reintentos devuelve "! Éxito!" Quiero Toast que como un mensaje a El usuario (por ejemplo: "se envió su formulario")

¿Qué hay de malo en runOnUiThread ?

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable )

 activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show(); } }); 

Use debajo del código. Crear objeto de actividad que contiene su instancia de actividad.

 activity.runOnUiThread(new Runnable() { public void run() { Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show(); } ); 

Esto le permitirá mostrar el mensaje sin necesidad de confiar en el contexto para iniciar el brindis, sólo para hacer referencia al mostrar el mensaje en sí.

RunOnUiThread no funcionaba desde un subproceso de OpenGL View y ésta era la solución. Espero eso ayude.

 private Handler handler = new Handler(); handler.post(new Runnable() { public void run() { Toast.makeText(activity, "Hello, world!", Toast.LENGTH_SHORT).show(); } }); 

No puedes simplemente emitir el resultado de getThread() a una instancia de tu clase base MyActivity . getThread() devuelve un Thread que no tiene nada que ver con Activity .

No hay gran – lea: limpio – manera de hacer lo que quieres hacer. En algún momento, su abstracción de "hilo de trabajo" tendrá que tener una referencia a algo que puede crear un Toast para usted. Ahorro de alguna variable estática que contiene una referencia a su subclase de Activity simplemente para ser capaz de atajo La creación de Toast es una receta para fugas de memoria y dolor.

¿Por qué no enviar una intención que es capturado por un BroadCastReceiver, a continuación, el receptor de difusión puede crear una notificación en la bandeja de notificación. No es un brindis, pero es una manera de informar al usuario de que su puesto ha sido exitoso.

Si usted tiene el contexto con usted, usted puede llamar el hilo del ui como esto de la clase no de la actividad.

 ((Activity)context).runOnUiThread(new Runnable() { public void run() { // things need to work on ui thread } }); 

Si está dentro de su propia actividad, ¿por qué no puede simplemente llamar a doToast() ?

  • Diferencia entre Handler.post (Runnable r) y Activity.runOnUiThread (Runnable r)
  • ¿Qué es el UiThread de Android (subproceso de interfaz de usuario)
  • ¿OnPreExecute () y onPostExecute () se ejecutan en el subproceso de interfaz de usuario o en el subproceso desde el que se inició AsyncTask?
  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ()
  • IU de Android: ¿cuándo puedo modificar directamente una vista?
  • Android ViewPager cambia automáticamente la página
  • Cómo saber si este hilo es un hilo de interfaz de usuario
  • Android, creando un hilo sencillo que actualizará mi contador de segundos
  • ¿Es una buena práctica crear AsyncTask anónima para paralelo pequeño proceso de congelación conocido?
  • No error "Sólo el subproceso original que creó una jerarquía de vista puede tocar sus vistas" cuando la vista se actualiza sin demora
  • Android: ¿Posible que el hilo de fondo bloquee hasta que el hilo de UI finalice la operación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.