2012-04-24 7 views
0

다른 스레드의 UI 업데이트가 금지되어 있으므로 응용 프로그램에서 어떤 결과가 나올지 알았습니다. 예, UI 구성 요소를 업데이트 할 때 앱이 중단되지만 이해가 안되는 경우가 하나 있습니다. 앱이 정상적으로 실행됩니다.다른 스레드의 UI 업데이트

1)

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     tv = (TextView)findViewById(R.id.textView1); 
     bt = (Button)findViewById(R.id.button1); 

     new Thread(){ //1      
      public void run() {        
       tv.setText("changed");      
     }}.start(); //1 } 
    } 

2) 내 문제의 내 이전 설명 죄송합니다

public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     tv = (TextView)findViewById(R.id.textView1); 
     bt = (Button)findViewById(R.id.button1); 

     bt.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       new Thread(){ //1      
         public void run() {        
          tv.setText("changed");      
        }}.start(); //1 } 
      } 

     }); 


    } 

, 나는 대부분의 사람들이 오해 생각, 그래서 질문을 바꿔. 위의 시나리오는 두 가지입니다. 두 스레드 모두 새 스레드를 만들고 UI 구성 요소를 업데이트하기 때문에 오류가 발생하지만 실제로는 두 번째 시나리오 충돌 만 발생하지만 fisrt 시나리오는 충돌하지 않습니다. 누구든지 그 이유를 아나?

+0

runOnUiThread 또는 UI 스레드에서 핸들러를 생성 한 다음 (예 : 클래스에서 필드 또는 최종 Handler로 로컬 변수로 변경) handler.post를 사용하십시오. Runnable은이 함수의 인자가 될 것이고 코드는 UI 스레드에서 무엇을하고 싶은지에 대한 것입니다. –

+0

안녕하십니까. 나는 아직도 당신이 무엇을 의미하는지 분명하지 않다. 이 기능은 adroid에 존재합니까 아니면 J2SE에도 존재합니까? 보통 J2SE에서이 방법을 사용하여 새 스레드를 만들 수있었습니다. 맞습니까? –

+0

나는이 질문을 다시 말하고 쉽게 이해할 수있다. –

답변

1

확인이 예외

E/AndroidRuntime(7652): FATAL EXCEPTION: Thread-19449 
E/AndroidRuntime(7652): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
E/AndroidRuntime(7652): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4357) 
E/AndroidRuntime(7652): at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:802) 
E/AndroidRuntime(7652): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:851) 
E/AndroidRuntime(7652): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4312) 
E/AndroidRuntime(7652): at android.view.View.invalidate(View.java:8603) 
E/AndroidRuntime(7652): at android.view.View.invalidate(View.java:8554) 

UI 스레드 만 무효화 (렌더링) 시간을 체크 검사.
그래서 생성 시간 (onCreate)에는 아무런 문제가 없습니다.

setText 전에 Thread.sleep (5000)을 추가 할 수 있으며 위의 예외가 발생합니다.

+0

오, 너 락! 이유를 찾은 것 같아요. 당신의 대답이 가장 합리적입니다. 감사. –

+0

아, 나는 투표하기에 충분한 명성이 없다. 너는 엄지 손가락을받을 가치가있어. –

+0

하하, 고마워. 원한다면 내 대답을 수락하거나 투표를 올리십시오. –

0

확인이 밖으로 대신 스레딩, 작업의 이런 종류의 사용 AsyncTask를의

private void startthread() { 
anihandler = new Handler() { 

@Override 
public void handleMessage(Message msg) { 
    super.handleMessage(msg); 

    tv.setText("changed"); 
} 

}; 

aniThread = new Thread() { 
    public void run() { 
sleep(1000); 
       anihandler.sendMessage(anihandler 
         .obtainMessage()); 


} 
}; 

aniThread.start(); 
} 
+0

나는이 질문을 반복하고, 이해하기가 더 쉬울 수있다. –

0

. 모두 here으로 매우 사용하기 쉽습니다.

+0

나는이 질문을 반복하고, 이해하기가 더 쉬울 수있다. –

관련 문제