java.lang.RuntimeException: Handler (android.os.Handler) 向死线程上的 Handler 发送消息 [英] java.lang.RuntimeException: Handler (android.os.Handler) sending message to a Handler on a dead thread
问题描述
在我的应用中,我使用 IntentService 发送短信.
in my app I'm using IntentService for sending 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());
}
}
}
}
}
运行应用程序时,出现以下错误:
when running the app, I get the following 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)
我的 SMSReceiver 位于另一个类中.我该如何解决这些问题?谢谢;艾尔.
My SMSReceiver is located in another class. How can i solve this problems? Thanks; Eyal.
推荐答案
这里的问题是您正在由 IntentService
管理的线程内创建一个 Toast
.系统将使用与该线程关联的Handler
来显示和隐藏Toast
.
The problem here is that you are creating a Toast
inside a thread that is managed by the IntentService
. The system will use the Handler
associated with this thread to show and hide the Toast
.
首先 Toast
会正确显示,但是当系统试图隐藏它时,在 onHandleIntent
方法完成后,错误sending message to a Handler on一个死线程"将被抛出,因为创建 Toast
的线程不再有效,并且 Toast
不会消失.
First the Toast
will be shown correctly, but when the system tries to hide it, after the onHandleIntent
method has finished, the error "sending message to a Handler on a dead thread" will be thrown because the thread on which the Toast
was created is no longer valid, and the Toast
will not disappear.
为避免这种情况,您应该显示 Toast
向主线程发布消息.举个例子:
To avoid this you should show the Toast
posting a message to the Main Thread. Here's an example:
// 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();
}
});
这篇关于java.lang.RuntimeException: Handler (android.os.Handler) 向死线程上的 Handler 发送消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!