android android-intent service handler runtimeexception

java.lang.RuntimeException: Handler(android.os.Handler) que envía un mensaje a un controlador en un hilo muerto



android-intent service (3)

en mi aplicación estoy usando IntentService para enviar SMS.

@Override protected void onHandleIntent(Intent intent) { Bundle data = intent.getExtras(); String[] recipients = null; String message = getString(R.string.unknown_event); String name = getString(R.string.app_name); if (data != null && data.containsKey(Constants.Services.RECIPIENTS)) { recipients = data.getStringArray(Constants.Services.RECIPIENTS); name = data.getString(Constants.Services.NAME); message = data.getString(Constants.Services.MESSAGE); for (int i = 0; i < recipients.length; i++) { if(!StringUtils.isNullOrEmpty(recipients[i])) { try { Intent sendIntent = new Intent(this, SMSReceiver.class); sendIntent.setAction(Constants.SMS.SEND_ACTION); PendingIntent sendPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, sendIntent, PendingIntent.FLAG_UPDATE_CURRENT); Intent deliveryIntent = new Intent(this, SMSReceiver.class); deliveryIntent.setAction(Constants.SMS.DELIVERED_ACTION); PendingIntent deliveryPendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, deliveryIntent, PendingIntent.FLAG_UPDATE_CURRENT); SmsManager.getDefault().sendTextMessage(recipients[i].trim(), null, "[" + name + "] " + message, sendPendingIntent, deliveryPendingIntent); } catch (Exception e) { Log.e(TAG, "sendTextMessage", e); e.printStackTrace(); Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); MainActivity.instance.writeToLogFile(e.getMessage(), System.currentTimeMillis()); } } } } }

cuando ejecuto la aplicación, aparece el siguiente error:

W/MessageQueue(7180): Handler (android.os.Handler) {42586468} sending message to a Handler on a dead thread W/MessageQueue(7180): java.lang.RuntimeException: Handler (android.os.Handler) {42586468} sending message to a Handler on a dead thread W/MessageQueue(7180): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294) W/MessageQueue(7180): at android.os.Handler.enqueueMessage(Handler.java:618) W/MessageQueue(7180): at android.os.Handler.sendMessageAtTime(Handler.java:587) W/MessageQueue(7180): at android.os.Handler.sendMessageDelayed(Handler.java:558) W/MessageQueue(7180): at android.os.Handler.post(Handler.java:323) W/MessageQueue(7180): at android.widget.Toast$TN.hide(Toast.java:367) W/MessageQueue(7180): at android.app.ITransientNotification$Stub.onTransact(ITransientNotification.java:55) W/MessageQueue(7180): at android.os.Binder.execTransact(Binder.java:351) W/MessageQueue(7180): at dalvik.system.NativeStart.run(Native Method)

My SMSReceiver está ubicado en otra clase. ¿Cómo puedo resolver este problema? Gracias; Eyal.


Creo que debes verificar una condición:

mHandler.getLooper().getThread().isAlive()

La aplicación solo te advertirá sobre este error. Por supuesto, en su mayoría no es fatal. Pero si hay muchos usos engendrados de este controlador, estas advertencias ralentizarán la aplicación.


El problema aquí es que estás creando un Toast dentro de un hilo que es administrado por el IntentService . El sistema utilizará el Handler asociado a este hilo para mostrar y ocultar el Toast .

Primero, el Toast se mostrará correctamente, pero cuando el sistema intente ocultarlo, después de que el método onHandleIntent haya finalizado, se onHandleIntent el error "enviando un mensaje a un controlador en un hilo muerto" porque el hilo en el que se creó Toast es ya no es válido, y la Toast no desaparecerá.

Para evitar esto, debe mostrar el Toast publicando un mensaje en el hilo principal. Aquí hay un ejemplo:

// create a handler to post messages to the main thread Handler mHandler = new Handler(getMainLooper()); mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_SHORT).show(); } });


Mostrar brindis en IntentService . prueba este código ...

@Override public void onCreate() { super.onCreate(); mHandler = new Handler(); } @Override protected void onHandleIntent(Intent intent) { mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(MyIntentService.this, "Test", Toast.LENGTH_LONG).show(); } }); }

fuente: - https://.com/a/5420929/4565853