Android - 发送消息到一个死线程的处理程序,Toast 错误

8

我正在使用C2DM服务,当我收到消息时,我同时也会收到一个“在已经停止的线程上向处理程序发送消息”的错误,而我想看到到达的消息。 使用的代码如下:

@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)

我也遇到了同样的问题,你最终找到解决方案了吗? - ToddH
我已经从Toast消息转移到通知栏以显示我从服务器获取的消息。我无法将其作为Toast运行。目标是在应用程序和构造函数中仔细使用上下文。 - Waypoint
2个回答

5

有一个解决方法。但是我无法使用这个解决方法使其工作。

我通过在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 消息触发了该问题。我解决了类似的问题。 - Fanglin

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接