gpt4 book ai didi

android - java.lang.RuntimeException : Handler (android. os.Handler) 向死线程上的 Handler 发送消息

转载 作者:IT老高 更新时间:2023-10-28 13:24:50 27 4
gpt4 key购买 nike

在我的应用中,我使用 IntentService 发送短信。

    @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 位于另一个类中。我该如何解决这个问题?谢谢;艾尔。

最佳答案

这里的问题是您在由 IntentService 管理的线程内创建了一个 Toast。系统将使用与该线程关联的Handler来显示和隐藏Toast

首先 Toast 会正确显示,但是当系统试图隐藏它时,在 onHandleIntent 方法完成后,错误“正在向 Handler 发送消息”将抛出一个死线程”,因为创建 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();
}
});

关于android - java.lang.RuntimeException : Handler (android. os.Handler) 向死线程上的 Handler 发送消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20059188/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com