2011-10-09 3 views
2

UI 스레드가 아니라면 어떤 스레드도 현재보기에 액세스 할 수 없다는 것을 알고 있습니다. 나는 왜 궁금해하니? 어떤 스레드가 뷰를 변경시키는 것이 중요한가요? 보안상의 이유입니까?UI 스레드가 아닌 스레드가보기에 액세스 할 수없는 이유는 무엇입니까?

 public void doLayout() 
     { 
      Runnable run = new Runnable() 
      { 
       public void run() 
       { 
        ViewerActivity.setContentView(R.layout.main); 
       } 
      }; 

      handler.post(run); 
     } 

     private Handler handler;' 

그것은 내가 레이아웃을 변경하려면 그 때마다 할 수있는 고통의 종류 : 이것은 내가 사용하는 주위의 작품입니다. 다른 해결 방법이 있습니까? 비동기 작업에 대해 알고 있고 그것을 사용하는 좋은 방법을 찾지 못했습니다. 내가하는 일보다 낫지 않습니까? 모든 관련 답변은 appriciated 있습니다!

+4

당신은 (사용하는 경우 즉 "동기") 자바/동기화 잠금에 대한 자세한 내용을 읽어야합니다 - 당신이 이해하면 당신은 순서대로 남이해야 할 이유가 명백 할 것이다 별도의 스레드에서 UI 스레드와 상호 작용할 수 있습니다. –

+0

분리 이유는 교착 상태를 피하기 위해서입니다. 예를 들어 어떤 스레드에서든 뷰를 자유롭게 수정할 수 있다고 가정합니다. DB 호출을하는 것처럼 보자. 따라서 뷰 구성 요소에 대한 처리기를 가져 와서 데이터베이스를 쿼리하지만 데이터베이스는 현재 스레드를 잠근 다음 잠급니다. 뷰를 수정하는 중 이었기 때문에 이제는 UI 스레드가 잠기고 안전하게 계속하기 전에 뷰가 해제 될 때까지 기다려야합니다. 이것은 현재하는 것보다 훨씬 더 많은 것을 끝내게 될 정말로 나쁜 프로그램을 만들 것입니다. – methodin

+0

플랫폼 및 언어에 관계없이 대부분의 UI는 기본 UI 스레드의 UI에만 액세스 할 수 있으며 일반적으로 스레드 안전 UI를 만드는 것은 매우 어렵고 그만한 가치가 없으며 원치 않는 속도 위반이 될 수 있습니다 그래픽 UI 환경이 신속하고 신속하게 대응되어야합니다. – nos

답변

12

예 예 : 보안을 위해 다른 스레드에서보기를 수정할 수 없습니다 (UI 스레드라고하는 이유). UI 데이터를 일관성없는 상태로 두지 않아 응용 프로그램이 손상 될 수 있으며 디버깅하기가 어려울 수 있습니다. 따라서 안드로이드 API는 단순히 그것을 금지합니다 (좋은 생각입니다). 이는 대부분의 API에서 볼 수있는 일반적인 UI 패턴입니다.

anyView.post(new Runnable() { 
    public void run() { 
     // do update here 
    } 
}); 

왜이 패턴 :

당신은 post() 또는 runOnUiThread()있는 모든보기를 업데이트 할 수 있습니까?
동기화가 무료가 아닙니다. 그것은 성능에 영향을 미칩니다. 따라서 동일한 스레드에서 UI 수정을 유지하는 것이 더 쉽습니다.

다른 스레드의 데이터를 수정할 수 있다면 어떻게 될까요?
예 : 스레드 A이보기의 색을 변경하고 스레드 B이 같은 시간에 색을 읽습니다. 멀티 스레딩은 어떤 명령어가 먼저 실행되는지 보장하지 않기 때문에 예기치 않은 결과가 발생할 수 있습니다. A은 흰색 (255|255|255)을 설정하고 빨간색 구성 요소를 255으로 설정하기 시작하고 B 스레드가 읽기를 시작하고 스레드가 완료되기 전에 전체 색상을 얻습니다. A이 완료되어 색상을 얻었습니다 빨간색 (255|0|0) 대신 검정색.

이것은 시각적 효과에 영향을주는 간단한 예이지만 일부 중요한 데이터에 이러한 문제가 발생하면 응용 프로그램이 끔찍하게 중단되고 이러한 오류는 디버그하기가 매우 어렵습니다. 이 멀티 스레딩에 대해 배울 수있는 많은 그리고 어쩌면 this java tutorial가 좋은 출발점은 ...

1

안드로이드 응용 프로그램은 Single Thread Model을 사용하고,이 스레드는 UI 요소에 다양한 이벤트를 전달 할 책임이있다. 두 가지 규칙이있다이 단일 스레드 모델 : 당신이 사용하는 스레드를 생성하는 경우

  1. 는 UI 스레드

외부에서 안드로이드 UI 툴킷에 액세스하지 마십시오 UI 스레드를 차단하지 마십시오 View 외부의 UI thread 두 번째 규칙을 위반합니다.

1

보안은 유일한 UI 스레드가보기에 액세스 할 수있는 유일한 스레드입니다. 주된 이유는 뷰 뒤에있는 코드가 스레드로부터 안전하지 않기 때문일 수 있습니다. 즉, 여러 스레드에서 공통 변수를 읽거나 쓰는 경우 데이터가 손상되지 않는다는 보장이 없습니다.

체크 아웃이 great wikipedia article about thread safety.