2010-05-12 3 views
2

와 CalledFromWrongThreadException를 확인할 수 없습니다이 핸들러

public final class MHandler extends Handler{ 

     //main activity 
private ARViewer arnv; 

     public MHandler(ARViewer arnv){ 
    this.arnv = arnv; 
} 

     @Override 
public void handleMessage(Message msg) { 
      ... 
      case H_RR : 
        arnv.setContentView(R.layout.routeplanner);  
        break; 
      ... 
    super.handleMessage(msg); 
} 
} 

그러나 다른 클래스의 콜백 함수에서 handleMessage 메서드를 호출하면 다른 스레드에서 확실히 예외 메시지가 표시됩니다. CalledFromWrongThreadException (Only the original thread that created a view hierarchy can touch its views) :

public void rFound(Route route) { 
      Message msg = new Message(); 
      msg.what = MHandler.H_RR; 
      ARViewer.arnv.mHandler.handleMessage(msg); 
} 

답변

3

거기서의 활동에 대한 참조는 필요하지 않습니다. UI 작업을 수행하는 위치에서 새 실행 파일을 만듭니다. 그리고 mHandler.post (myUIRunnable)를 수행하십시오. 예제는 다음과 같습니다. http://developer.android.com/guide/appendix/faq/commontasks.html#threading

+0

이전에이 해결책을 찾았지만 작동시키지 못했습니다. 나는 다시 그것을 보게 될 것이다. 덕분에 – Michel

+0

스레드에서 setContentView (R.layout.routeplanner)를 설정하는 이유는 무엇입니까? 그것을 onCreate에 설정 한 다음 findViewById (R.id.myview)로 뷰/레이아웃을 업데이트하고 올바른 내용/값/가시성을 설정하십시오. –

+0

'routeplanner'보다 많은 뷰 (그룹)가 있으므로 핸들러를 원합니다. 모든보기 – Michel

0

메시지 ID가 H_RR 인 Handler의 경우 sendMessage()를 호출해야합니다. 그러면 자동으로 메인 스레드의 handleMessage()가 호출됩니다.