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

  • ¿De dónde viene esta tostada?
  • No se puede crear el controlador dentro de hilo que no ha llamado Looper.prepare () 3
  • ¿Puedo cancelar Toast anterior cuando quiero mostrar otro Toast?
  • Cómo configurar el estilo tostado como tema?
  • ¿Terminar la actividad después de que el mensaje del pan tostado desaparezca?
  • ¿Por qué Toast.makeText y no Toast nuevo
  • Android: brindis en un hilo
  • Cómo cancelar Toast creado en un método diferente en android?
  • Tostas versus cuadros de diálogo: ¿cuál usar cuando?
  • Incompatibilidad de tipo: no se puede convertir void to toast
  • ¿Por qué no aparece mi brindis?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.