2012-07-20 3 views
0

나는 안드로이드 플랫폼에 서버 클라이언트를 쓰고있다. 클라이언트 중 하나가 메시지 하나를 보내면 먼저 메시지가 서버로 보내지고 서버가 클라이언트로 메시지를 보냅니다. 수신자 클라이언트가 메시지를 받으면 setContentView에 메시지 화면을 열어야합니다. 그러나 다른 스레드에서 메시지를 가져오고 참조로 내 액티비티 클래스를 전달합니다. ViewRoot CalledFromWrongThread과 같은 오류 내가 무엇을 할 수를 제공하기 때문에 다른 스레드에 setContentView

Thread my = new MyThread(this); 

및 스레드 클래스 I 캔트에

콘텐츠보기를 설정?

+0

포스트 코드 우리 수정을 도울 수 있습니다. –

답변

2
ActivityName.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // set contentview here 
    } 
}); 
+0

하지만 내 스레드는 다른 클래스이며 설정 한 콘텐츠뿐만 아니라 많은 작업을 수행합니다. 스레드 threadReciever = 새로운 ThreadRecieve (this); threadReciever.start(); 나는 그것을 이렇게 창조한다. 그래서 무엇을 제안합니까? – Emre

7

UIThread는 응용 프로그램의 주요 실행 스레드입니다. 여기가 대부분의 응용 프로그램 코드가 실행되는 곳입니다. 이 스레드에는 응용 프로그램 구성 요소 (활동, 서비스, ContentProviders, BroadcastReceivers)가 모두 생성되고 해당 응용 프로그램에 대한 시스템 호출 이이 스레드에서 수행됩니다.

백그라운드에서 작업 할 새 스레드를 명시 적으로 생성하면 이 코드는 UIThread에서 실행되지 않습니다. 그렇다면 배경 스레드가 UI를 변경하는 작업을 수행해야하는 경우 어떻게됩니까? 이 은 runOnUiThread입니다. 사실 핸들러를 사용해야합니다 (자세한 내용은 아래 링크 참조). 이 백그라운드 스레드는 UI를 수정할 수있는 코드를 실행할 수있는 기능을 제공합니다. 그들은 UI 수정 코드를 Runnable 객체에 넣고 을 RunOnUiThread 메소드에 전달하여이 작업을 수행합니다.

한마디로

(UI 스레드가 무엇인지에 대한 자세한 설명은 https://stackoverflow.com/a/3653478/448625 참조),이 그것을 수정해야합니다 : 그래서

runOnUiThread(new Runnable() { 
    public void run() { 
     // some code that needs to be ran in UI thread 
    } 
}); 
+0

도움 주셔서 감사합니다. 스레드 threadReciever = 새로운 ThreadRecieve (this); threadReciever.start(); ı가 메시지를 받았을 때 이것은 내 스레드가 아니 었습니다. † contentview를 변경하려고 시도했습니다. 너 runOnUiThread 라이트를 사용하라고 나 한테 충고 하나? – Emre

+0

기꺼이 도와 드리겠습니다. 질문에 대한 답이 있으면 대답을 수락하는 것도 고려해보십시오 : http://meta.stackexchange.com/a/5235/172216 – Caner

+0

'setContentView' 행을'run()'메소드 안에 넣기를 권합니다. 대답은 – Caner

0
ActivityName.this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 

    } 
}); 
관련 문제