2011-09-06 28 views
8

私はC2DMサービスを使用していますが、メッセージを受け取ったときにToastメッセージを表示しているときに "Dead threadのハンドラにメッセージを送信中"私は到着したメッセージを見たい。コードを使用して:Android - デッドスレッドでハンドラにメッセージを送信する、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を拡張するクラスで使用されています。トーストメッセージは決して表示されません。

ここのエラーは何ですか?ソウルティオンはありますか?

編集:

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) 
+0

私は同じ問題を抱えていますが、あなたは解決策を見つけましたか? – ToddH

+0

ToastメッセージからNotificationバーに移動しました。メッセージを表示します。サーバから取得しました。私はトーストとしてそれを実行することができませんでした。目標はあなたのアプリとコンストラクタで慎重にコンテキストを使用することです – Waypoint

答えて

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メソッドを呼び出すことができます。

うまくいきますように!

+1

+1もう一つの回避策は私のためには機能しませんでした。これはうまくいった。 – Ixx

+0

到着したEventBusメッセージによってトリガされたWindowManagerを通してビューを追加する際に同様の問題が発生しました。 – lifelogger

関連する問題