【问题标题】:Android - Sending message to a handler on a dead thread, Toast errorAndroid - 向死线程上的处理程序发送消息,Toast 错误
【发布时间】:2011-09-06 09:10:12
【问题描述】:

我正在使用 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)

【问题讨论】:

  • 我也遇到了同样的问题,你有没有找到解决办法?
  • 我已从 Toast 消息移动到通知栏,并显示我从服务器获得的消息。我无法将它作为 Toast 运行。目标是在您的应用和委托人中谨慎使用上下文

标签: android android-c2dm toast


【解决方案1】:

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

我通过在 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 方法了。

希望它有效!

【讨论】:

  • 解决了我通过 WindowManager 添加视图的类似问题,该问题由传入的 EventBus 消息触发。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-06-18
    • 2013-12-02
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    相关资源
    最近更新 更多