Java.lang.RuntimeException: No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare ();

Tengo una aplicación para Android que ejecuta un subproceso. Quiero que se muestre un mensaje de Toast con un mensaje.

Cuando hago esto, obtengo la siguiente excepción:

Traza de Logcat :

FATAL EXCEPTION: Timer-0 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() at android.os.Handler.<init>(Handler.java:121) at android.widget.Toast$TN.<init>(Toast.java:322) at android.widget.Toast.<init>(Toast.java:91) at android.widget.Toast.makeText(Toast.java:238) 

¿Hay un trabajo alrededor para empujar los mensajes de la tostada de hilos a la interfaz de usuario?

Tengo esta excepción porque estaba tratando de hacer un Toast popup de un hilo de fondo.
Toast necesita una actividad para enviar a la interfaz de usuario y los subprocesos no lo tienen.
Así que una solución es darle al hilo un vínculo a la actividad principal ya brindar por eso.

Ponga este código en el hilo donde desea enviar un mensaje Toast:

 parent.runOnUiThread(new Runnable() { public void run() { Toast.makeText(parent.getBaseContext(), "Hello", Toast.LENGTH_LONG).show(); } }); 

Mantenga un vínculo con la actividad principal en el subproceso de fondo que creó este subproceso. Utilice la variable padre en su clase de subproceso:

 private static YourActivity parent; 

Cuando crea el hilo, pase la actividad principal como un parámetro a través del constructor de esta manera:

 public YourBackgroundThread(YourActivity parent) { this.parent = parent; } 

Ahora el hilo de fondo puede empujar los mensajes Toast a la pantalla.

Android básicamente funciona en dos tipos de hilos, a saber, el hilo de la interfaz de usuario y el hilo de fondo. De acuerdo con la documentación de Android –

No tiene acceso al kit de herramientas de la interfaz de usuario de Android desde fuera del hilo de la interfaz de usuario para solucionar este problema, Android ofrece varias formas de acceder al subproceso de interfaz de usuario de otros subprocesos. Aquí hay una lista de métodos que pueden ayudar:

 Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) 

Ahora hay varios métodos para resolver este problema. Lo voy a explicar por ejemplo de código

RunOnUiThread

 new Thread() { public void run() { myactivity.this.runOnUiThread(new runnable() { public void run() { //Do your UI operations like dialog opening or Toast here } }); } }.start(); 

LOOPER

Clase utilizada para ejecutar un bucle de mensaje para un subproceso. Los hilos por defecto no tienen un bucle de mensaje asociado con ellos; Para crear uno, llame prepare () en el subproceso que va a ejecutar el bucle, y luego loop () para que los mensajes de proceso hasta que el bucle se detiene.

 class LooperThread extends Thread { public Handler mHandler; public void run() { Looper.prepare(); mHandler = new Handler() { public void handleMessage(Message msg) { // process incoming messages here } }; Looper.loop(); } 

AsyncTask

AsyncTask le permite realizar trabajo asincrónico en su interfaz de usuario. Realiza las operaciones de bloqueo en un subproceso de trabajo y luego publica los resultados en el subproceso de interfaz de usuario, sin necesidad de que usted mismo maneje subprocesos y / o controladores.

 public void onClick(View v) { new CustomTask().execute((Void[])null); } private class CustomTask extends AsyncTask<Void, Void, Void> { protected Void doInBackground(Void... param) { //Do some work return null; } protected void onPostExecute(Void param) { //Print Toast or open dialog } } 

Entrenador de animales

Un controlador le permite enviar y procesar mensajes y objetos ejecutables asociados con MessageQueue de un subproceso.

 Message msg = new Message(); new Thread() { public void run() { msg.arg1=1; handler.sendMessage(msg); } }.start(); Handler handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { if(msg.arg1==1) { //Print Toast or open dialog } return false; } }); 

Desde http://developer.android.com/guide/components/processes-and-threads.html :

Además, el kit de herramientas de la interfaz de usuario de Android no es seguro para subprocesos. Por lo tanto, no debe manipular su interfaz de usuario desde un subproceso de trabajo . Debe hacer toda la manipulación a su interfaz de usuario desde el subproceso de interfaz de usuario. Por lo tanto, hay simplemente dos reglas para el modelo de hilo único de Android:

  1. No bloquee el hilo de la interfaz de usuario
  2. No accedas al kit de herramientas de la interfaz de usuario de Android desde fuera del hilo de la interfaz de usuario

Tienes que detectar la ociosidad en un hilo de trabajo y mostrar un brindis en el hilo principal.

Por favor, publique algún código, si desea una respuesta más detallada.

Después de la publicación de código:

En strings.xml

 <string name="idleness_toast">"You are getting late do it fast"</string> 

En YourWorkerThread.java

 Toast.makeText(getApplicationContext(), getString(R.string.idleness_toast), Toast.LENGTH_LONG).show(); 

No utilice AlertDialog, haga una elección. AlertDialog y Toast son dos cosas diferentes.

Esto es lo que he estado haciendo:

  public void displayError(final String errorText) { Runnable doDisplayError = new Runnable() { public void run() { Toast.makeText(getApplicationContext(), errorText, Toast.LENGTH_LONG).show(); } }; messageHandler.post(doDisplayError); } 

Eso debería permitir que el método sea llamado desde cualquier subproceso.

Donde messageHandler se declara en la actividad como ..

 Handler messageHandler = new Handler(); 

Simplemente puede utilizar BeginInvokeOnMainThread (). Invoca una Acción en el subproceso principal del dispositivo (UI).

 Device.BeginInvokeOnMainThread(() => { displayToast("text to display"); }); 

¡Es simple y funciona perfectamente para mí!

EDIT: funciona si está utilizando C # Xamarin

  • Cómo utilizar Tostadas cuando no puedo usar "esto" como contexto
  • La cancelación personalizada de la tostada no funciona
  • ¿Botón en la tostada de encargo de Android?
  • Abrir PDF en un WebView
  • Cómo establecer el tiempo de visualización de Toast menos de Toast.LENGTH_SHORT
  • Cómo configurar el estilo tostado como tema?
  • Mostrar una imagen en un brindis
  • Android - ¿Cómo excute el brindis cada 10 segundos usando ScheduledExecutorService?
  • Problema con Toast en llamada AsyncTask método
  • Ocultar toast
  • Problema de brindis en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.