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

时间:2011-09-06 09:10:13

标签: android android-c2dm toast

我正在使用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 messatge永远不会显示。

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

编辑:

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)

2 个答案:

答案 0 :(得分:5)

有一种解决方法。但是,我无法使用该解决方法。

我通过在C2DMBaseReceiver构造函数中创建一个Handler并添加了一个显示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方法。

希望它有效!

答案 1 :(得分:3)

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