Ява.ленг.RuntimeException: обработчик (android.ОС.Обработчик) отправка сообщения обработчик на мертвой нить
в моем приложении я использую IntentService для отправки 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());
}
}
}
}
}
при запуске приложения, я получаю следующую ошибку:
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)
мой SMSReceiver находится в другом классе. Как я могу решить эту проблему? Спасибо; Эял.
3 ответа:
проблема здесь в том, что вы создаете
Toast
внутри потока, который управляетсяIntentService
. Система будет использоватьHandler
связанный с этой нитью, чтобы показать и скрытьToast
.сначала
Toast
будет отображаться правильно, но когда система пытается скрыть ее, послеonHandleIntent
метод завершен, ошибка "отправка сообщения обработчику на Мертвом потоке" будет выброшена, потому что поток, на которомToast
был создан больше не действителен, и элементToast
не исчезнет.чтобы избежать этого, вы должны показать
Toast
отправка сообщения в основной поток. Вот пример:// 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(); } });
Display тост on IntentService. попробуйте этот код..
@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(); } }); }