android-llamando a la interfaz ui desde el hilo del trabajador
android-activity toast (7)
Hola, quiero que Toast
esté disponible para mí sin importar qué, y esté disponible desde cualquier tema cuando lo desee dentro de mi aplicación. Entonces para hacer esto extendí 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));
}
}
para 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 subproceso 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 mientras la Activity
una " MyActivity
", debería funcionar, pero el problema es ---> el Looper.getMainLooper().getThread();
no me está devolviendo el MyActivity
y me está haciendo llorar, ¿qué estoy haciendo mal?
: EDITAR:
Algunos antecedentes para explicar "por qué" estoy atascado con este tipo de implementación.
Necesito poder confirmar al usuario que un evento "HTTP POST" ha sido un éxito. Ahora. Si el usuario hace clic en "Aceptar" en el formulario de la interfaz de usuario, PUEDE o PUEDE NO tener Internet en ese momento. Si tiene Internet, todo bien y bien, publica el formulario a través de HTTP POST todo bien y bien ... pero si hay NO hay Internet más (99.999% de las aplicaciones de Android son poco convincentes / patéticas / maullan ante esto, y básicamente no le ofrecen al usuario ningún plan "b", suponiendo que en todo momento Internet esté ahí, cuando NO lo esté)
Mi aplicación no "irá coja (como yo lo llamo)" - tiene un plan "b" en vez de eso "Cola" el evento posterior y vuelve a intentarlo cada x minutos ... ahora este es un hilo silencioso en segundo plano ... tengo mucha interacción con el usuario en toda la aplicación, no sé dónde "se encontrará" el usuario, pero finalmente, cuando el POST de HTTP que cola / reintentos / cola / reintentos devuelve "! ¡Éxito!", deseo Toast
un mensaje a el usuario (EG: "su formulario fue enviado")
¿Por qué no envía un intento que es capturado por un BroadCastReceiver, entonces el receptor de difusión puede crear una notificación en la bandeja de notificaciones. No es un brindis, pero es una forma de informar al usuario de que su publicación ha sido exitosa.
¿Qué pasa con 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();
}
});
Esto le permitirá mostrar el mensaje sin tener que depender del contexto para iniciar el brindis, solo como referencia cuando se muestra el mensaje.
runOnUiThread no funcionaba desde un hilo de vista de OpenGL y esta 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 lanzar el resultado de getThread()
a una instancia de tu clase base MyActivity
. getThread()
devuelve un Thread
que no tiene nada que ver con la Activity
.
No hay nada bueno, lee: limpio, forma de hacer lo que quieres hacer. En algún momento, la abstracción de su "hilo de trabajo" tendrá que hacer referencia a algo que pueda crear un Toast
para usted. Guardar una variable estática que contenga una referencia a su subclase de Activity
simplemente para poder hacer un acceso directo La creación de Toast
es una receta para las pérdidas de memoria y el dolor.
Si está dentro de su propia actividad, ¿por qué no puede simplemente llamar doToast()
?
Si tiene el contexto con usted, puede llamar al hilo de la interfaz de usuario como este desde una clase que no sea de actividad.
((Activity)context).runOnUiThread(new Runnable() {
public void run() {
// things need to work on ui thread
}
});
utilice el código de abajo. Crea un objeto de actividad que contenga tu instancia de actividad.
activity.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(activity.getApplicationContext(),"Toast text",Toast.LENGTH_SHORT).show();
}
);