2011-09-06 7 views
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를 확장 클래스에 사용됩니다. 토스트 메시지가 표시되지 않습니다.

여기에 오류가 있습니까? 어떤 soultion 있습니까?

편집 :

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

토스트 메시지에서 알림 바로 옮겼습니다. 서버에서 가져온 메시지가 표시됩니다. 나는 그것을 토스트로 돌릴 수 없었다. 목표는 앱 및 계약자의 컨텍스트를 신중하게 사용하는 것입니다. – Waypoint

답변

5

해결 방법이 있습니다. 그러나 나는 그 해결 방법을 사용할 수 없습니다.

C2DMBaseReceiver 생성자에 처리기를 만들어 유사한 문제를 해결하고 토스트를 보여주는 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

관련 문제