Android - 向死线程上的处理程序发送消息,Toast 错误

发布于 2024-12-03 06:44:18 字数 1677 浏览 1 评论 0原文

我正在使用 C2DM 服务,当我收到消息时,在显示 Toast 消息(我想在其中查看到达的消息)时,也会收到“将消息发送到死线程上的处理程序”的错误。使用代码:

@Override
protected void onMessage(Context context, Intent intent) {
    Log.e("C2DM", "Message: arived");
    Bundle extras = intent.getExtras();
    if (extras != null) {
        //Toast.makeText(this.getApplicationContext(), (CharSequence) extras.get("payload"), Toast.LENGTH_LONG).show();

    }
}

onMessage方法在扩展C2DMBaseReceiver的类中使用。 Toast 消息从不显示。

这里有什么错误?有灵魂吗?

编辑:

09-06 08:59:02.135: WARN/MessageQueue(5654): Handler{44e65658} sending message to a Handler on a dead thread
09-06 08:59:02.135: WARN/MessageQueue(5654): java.lang.RuntimeException: Handler{44e65658} sending message to a Handler on a dead thread
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:179)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.Handler.sendMessageAtTime(Handler.java:457)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.Handler.sendMessageDelayed(Handler.java:430)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.Handler.post(Handler.java:248)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.widget.Toast$TN.hide(Toast.java:344)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.app.ITransientNotification$Stub.onTransact(ITransientNotification.java:55)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.Binder.execTransact(Binder.java:288)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at dalvik.system.NativeStart.run(Native Method)

I am using C2DM services and when I get message, I get also error of "Sending message to a handler on a dead thread" while displaying Toast message, where I want to see message, which arrived. Using code:

@Override
protected void onMessage(Context context, Intent intent) {
    Log.e("C2DM", "Message: arived");
    Bundle extras = intent.getExtras();
    if (extras != null) {
        //Toast.makeText(this.getApplicationContext(), (CharSequence) extras.get("payload"), Toast.LENGTH_LONG).show();

    }
}

onMessage method is used in class which extends C2DMBaseReceiver. Toast messatge never displays.

What is the error in here? Is there any soultion?

Edit:

09-06 08:59:02.135: WARN/MessageQueue(5654): Handler{44e65658} sending message to a Handler on a dead thread
09-06 08:59:02.135: WARN/MessageQueue(5654): java.lang.RuntimeException: Handler{44e65658} sending message to a Handler on a dead thread
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.MessageQueue.enqueueMessage(MessageQueue.java:179)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.Handler.sendMessageAtTime(Handler.java:457)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.Handler.sendMessageDelayed(Handler.java:430)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.Handler.post(Handler.java:248)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.widget.Toast$TN.hide(Toast.java:344)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.app.ITransientNotification$Stub.onTransact(ITransientNotification.java:55)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at android.os.Binder.execTransact(Binder.java:288)
09-06 08:59:02.135: WARN/MessageQueue(5654):     at dalvik.system.NativeStart.run(Native Method)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怼怹恏 2024-12-10 06:44:18

有一个解决方法。但是我无法让它与该解决方法一起工作。

我通过在 C2DMBaseReceiver 构造函数中创建处理程序并添加显示 Toast 的 Runnable 解决了类似的问题。

像这样:

public void showToast(String message, Context context){
    handler.post(new DisplayToast(message, context));
}

private class DisplayToast implements Runnable{
    String mText;
    Context mContext;

    public DisplayToast(String text, Context context){
        mText = text;
        mContext = context;
    }

    public void run(){
        Toast.makeText(mContext, mText, Toast.LENGTH_LONG).show();
    }
}

然后你可以从子类调用 DisplayToast 方法。

希望它有效!

There is a workaround. However I can't get it to work with that workaround.

I solved a similar problem by creating a Handler in the C2DMBaseReceiver constructor and added a Runnable that shows the Toast.

Something like this:

public void showToast(String message, Context context){
    handler.post(new DisplayToast(message, context));
}

private class DisplayToast implements Runnable{
    String mText;
    Context mContext;

    public DisplayToast(String text, Context context){
        mText = text;
        mContext = context;
    }

    public void run(){
        Toast.makeText(mContext, mText, Toast.LENGTH_LONG).show();
    }
}

And then you can just call the DisplayToast method from the subclass.

Hope it works!

倾`听者〃 2024-12-10 06:44:18

请参阅 http://code.google.com/p/android/issues/ detail?id=20915,这是问题的可能根本原因。它包括该问题的解决方法。

See http://code.google.com/p/android/issues/detail?id=20915, which is a possible root cause of the problem. It includes a workaround for the issue.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文