in meiner App verwende ich IntentService zum Senden von 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());
}
}
}
}
}
beim Ausführen der App erhalte ich folgende Fehlermeldung:
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)
Mein SMSReceiver befindet sich in einer anderen Klasse . Wie kann ich diese Probleme lösen? Danke; Eyal.
Das Problem hierbei ist, dass Sie eine Toast
in einem Thread erstellen, der von der IntentService
verwaltet wird. Das System verwendet die Handler
, die diesem Thread zugeordnet ist, um die Toast
anzuzeigen und auszublenden.
Zuerst wird Toast
korrekt angezeigt, aber wenn das System versucht, es auszublenden, wird nach Beendigung der onHandleIntent
-Methode der Fehler "Senden einer Nachricht an einen Handler für einen toten Thread" ausgelöst, da der Thread, auf dem die Toast
erstellt wurde, ist nicht mehr gültig und die Toast
verschwindet nicht.
Um dies zu vermeiden, sollten Sie die Toast
anzeigen, die eine Nachricht an den Haupt-Thread sendet. Hier ist ein Beispiel:
// 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();
}
});
Zeigen Sie Toast auf IntentService..__ an. Versuchen Sie diesen Code ..
@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();
}
});
}
Ich denke, Sie müssen eine Bedingung überprüfen:
mHandler.getLooper().getThread().isAlive()
Die Anwendung wird Sie lediglich über diesen Fehler warnen. Natürlich ist es meistens nicht tödlich .. Wenn es jedoch viele Verwendungsmöglichkeiten dieses Handlers gibt, verlangsamen diese Warnungen die Anwendung.