Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Tostar "enviar mensaje a un manejador en un hilo muerto"

Estoy intentando exhibir un mensaje simple vía el pan, y estoy consiguiendo una excepción de RunTime "que envía el mensaje a un encargado en un hilo muerto". La clase que está intentando mostrar el mensaje Toast extiende IntentService. La clase (C2DMReceiver) proviene realmente del ejemplo de ChromeToPhone para C2DM. Aquí está el método:

/** * Called when a cloud message has been received. */ @Override public void onMessage(Context context, Intent intent) { Log.i(LOG_TAG, "A message notification has occured with the cloud."); Log.i(LOG_TAG, "Showing toast message of the broadcast..."); Toast toast = Toast.makeText(context, "Some text", Toast.LENGTH_LONG); toast.show(); Log.i(LOG_TAG, "Sending notification of the broadcast..."); LauncherUtils.generateNotification(this, "this is where the text would go.", "Broadcast", intent); } } 

Asumí desde que la clase extiende IntentService que sería posible solicitar un mensaje Toast simple de aquí de esta manera. ¿No es esto correcto?

  • Cómo crear una miniatura de vídeo desde la ruta del archivo de vídeo en Android
  • ¿Cuándo android muestra un diálogo de emparejamiento al usar zócalos inseguros del bluetooth de RFCOMM?
  • Cómo convertir bitmap a PNG y luego a base64 en Android?
  • ¿Puede Firebase Console enviar datos de carga útil?
  • React Native ListView TextInput se bloquea desde la renderización de optimización de rendimiento
  • Error java.lang.IndexOutOfBoundsException: El índice 0 no válido es 0 en mi programa android
  • ¿Qué significa SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS?
  • FragmentPagerAdapter no recrea Fragmentos en cambio de orientación?
  • Obtener "error: cerrado" dos veces en "adb reverso"
  • Icono de la barra de acciones que falta en Android 5
  • Biblioteca de procesamiento de imágenes para Android
  • ¿Qué debo hacer para iniciar el diálogo de configuración de Internet de teléfono?
  • 6 Solutions collect form web for “Tostar "enviar mensaje a un manejador en un hilo muerto"”

    Esto se debe a un error en AsyncTask en el marco de Android. AsyncTask.java tiene el código siguiente:

     private static final InternalHandler sHandler = new InternalHandler(); 

    Espera que esto se inicialice en el hilo principal, pero eso no está garantizado ya que se inicializará en cualquier hilo que suceda para hacer que la clase ejecute sus inicializadores estáticos. Reproduje este problema donde el manejador hace referencia a un subproceso de trabajo.

    Un patrón común que hace que esto suceda es utilizando la clase IntentService. El código de ejemplo C2DM lo hace.

    Una solución sencilla es agregar el código siguiente al método onCreate de la aplicación:

     Class.forName("android.os.AsyncTask"); 

    Esto forzará AsyncTask a inicializarse en el subproceso principal. Archivé un error en esto en la base de datos de errores de Android. Consulta http://code.google.com/p/android/issues/detail?id=20915 .

     public class NetworkService extends IntentService { Handler mMainThreadHandler = null; public NetworkService() { super(NetworkService.class.getName()); mMainThreadHandler = new Handler(); } @Override protected void onHandleIntent(Intent arg) { System.out.printf("Network service intent handling: %s\n", arg.toString()); mMainThreadHandler.post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "BusyBox updated", Toast.LENGTH_LONG).show(); } }); } } 

    Otra forma de realizar mensajes de tostado en el hilo principal desde el fondo es usar un pequeño método de utilidad para esto. El truco consiste en crear un controlador que se adjunta al looper del subproceso principal (Looper.getMainLooper ()).

     public class ToastUtils { public static void showToastInUiThread(final Context ctx, final int stringRes) { Handler mainThread = new Handler(Looper.getMainLooper()); mainThread.post(new Runnable() { @Override public void run() { Toast.makeText(ctx, ctx.getString(stringRes), Toast.LENGTH_SHORT).show(); } }); } } 

    Debe mostrar un brindis desde el hilo principal o no se mostrará en la pantalla. El manejador se ejecuta desde el subproceso en el que se creó. Si crea su controlador en onCreate de su intentservice, debería funcionar según lo previsto cuando envíe su mensaje.

    El método onMessage no se llamó en el subproceso principal.

    Así que usted necesita para hacer un nuevo manejador.

    Aplique este código:

     public class GCMIntentService extends GCMBaseIntentService { Handler handler; public GCMIntentService() { handler = new Handler(); } } 

    Usted puede ejecutar su código en el hilo ui como este:

     runOnUiThread(new Runnable() { public void run() { try { //YOUR CODE } catch (Exception e) { Log.d(TAG, e.getMessage()); } } }); 

    Esto debería funcionar bien

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.