it-swarm.com.de

java.lang.RuntimeException: Handler (Android.os.Handler) sendet eine Nachricht an einen Handler in einem toten Thread

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.

53
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();
        }
    });
151
rubenlop88

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();                
        }
    });
}

quelle: - https://stackoverflow.com/a/5420929/4565853

3
Finava Vipul

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. 

0
CodeToLife