안 드 로 이 드 인터페이스 리 셋 post send

9117 단어 android
인용
문제 도입
       이상: Only the original thread that created a view hierarchy can touch its views 솔 루 션   
 
       왜 이런 이상 이 생 겼 을 까?
    
      모든 프로그램 apk 가 처음 시 작 될 때 Android 는 대응 하 는 프로그램 을 동시에 시작 합 니 다.
메 인 스 레 드 (메 인 스 레 드),
      주 스 레 드 는 UI 와 관련 된 이 벤트 를 처리 합 니 다. 예 를 들 어 사용자 의 버튼 이벤트, 사용자 가 화면 에 접촉 하 는 이벤트 와 화면 그래 픽 이벤트,
      관련 사건 을 대응 하 는 구성 요소 에 나 누 어 처리 하기 때문에 메 인 스 레 드 는 보통
UI 스 레 드.
 
      그러나 안 드 로 이 드 애플 리 케 이 션 을 개발 할 때 는 단일 스 레 드 모델 의 원칙 을 지 켜 야 합 니 다. 
      
Android UI 작업 은 스 레 드 가 안전 한 것 이 아니 며, 이 작업 은 UI 스 레 드 에서 실행 되 어야 합 니 다. 비 UI 스 레 드 에서 UI 스 레 드 를 직접 조작 하면,
      android. view. ViewRoot $Called FromWrongThreadException: Only the original thread that 
      created a view hierarchy can touch its views, 이것 은 일반적인 자바 프로그램 과 다 릅 니 다.
 
       UI 스 레 드 는 이벤트 의 감청 과 그림 그리 기 를 담당 하기 때문에 UI 스 레 드 가 사용자 의 요구 에 수시로 응 할 수 있 도록 해 야 합 니 다.
       UI 스 레 드 의 동작 은 인 터 럽 트 이벤트 처럼 짧 아야 합 니 다. 시간 이 걸 리 는 동작 (예 를 들 어 네트워크 연결) 은 따로 스 레 드 를 열 어야 합 니 다.
       그렇지 않 으 면 UI 스 레 드 가 5s 를 초과 하여 사용자 요청 에 응답 하지 않 으 면 대화 상자 알림 이 팝 업 됩 니 다.
사용자 가 프로그램 (ANP) 을 종료 합 니 다.
 
       새로 연 스 레 드 에서 UI 를 설정 해 야 한다 면 단일 스 레 드 모델 을 위반 할 수 있 습 니 다.
       따라서 안 드 로 이 드 는 일종 의 Message Queue 메커니즘 을 사용 하여 보증 합 니 다.
스 레 드 간 통신.
 
       Message Queue 는 Handler 를 통 해 보 낸 메 시 지 를 저장 하 는 메시지 큐 입 니 다.
       Android 는 첫 번 째 프로그램 을 시작 할 때 기본적으로 UI thread 에 연 결 된 메시지 큐 를 만 듭 니 다.
      Looper. my Queue () 를 통 해 현재 스 레 드 의 메시지 큐 를 얻 을 수 있 습 니 다. 프로그램의 상부 구성 요 소 를 관리 할 수 있 습 니 다.
      activities, broadcast receivers 등 은 자신의 하위 스 레 드 에서 Handler 와 UI thread 통신 을 만 들 수 있 습 니 다.
 
      Handler 는 message quue 에 두 가지 방법 으로 메 시 지 를 보 냅 니 다: send 또는 post.
      이 두 가지 소식 은 모두 message quue 팀 의 꼬리 에 꽂 혀 먼저 실행 된다.
      그러나 이 두 가지 방법 으로 보 낸 메 시 지 를 실행 하 는 방식 은 약간 다르다.
      1) send 를 통 해 메시지 대상 을 보 냅 니 다. handler 의 handleMessage () 함수 에 의 해 처 리 됩 니 다.
      2) post 방법 으로 runnable 대상 을 보 내 면 스스로 실 행 됩 니 다.
 
      모든 그래 픽 인터페이스 가 시 작 된 후에 메 인 스 레 드 를 만 들 고 UI 스 레 드 라 고 할 수 있 습 니 다.
      이 스 레 드 는 자동 으로 message quue 를 만 듭 니 다. 시스템 에서 온 메시지 가 이 message quue 에 투 입 됩 니 다.
      먼저 나 온 순서대로 처리 합 니 다.
 
      UI 스 레 드 그래 픽 인터페이스 에 있 는 view 는 post 방법 으로 GUI 스 레 드 의 message quue 에 runnable 을 배달 할 수 있 습 니 다.
     UI 스 레 드 를 제외 한 다른 스 레 드 에 대해 서 는 생 성 시 메시지 큐 가 없습니다.
     UI 스 레 드 에 대해 서 는 직접 (예 를 들 어 onCreate) handler 를 만 들 고 handleMessage 를 다시 불 러 올 수 있 습 니 다.
     message quue 를 만 드 는 과정 을 생략 합 니 다.
해결 방안
      
[html] 
http://blog.csdn.net/tianshuai11/article/details/7428411
view plain
final Handler handler = new Handler(){     
        
            @Override  
        public void handleMessage(Message msg) {     
    
              
            if(msg.what == 0) / / 성공     
            {  
                Log.d(TAG, "**********************start****************************");  
                playVideo (strVideoPath); / 업데이트 인터페이스 포함 방법  
                Log.d(TAG, "***********************end*****************************");  
            }  
  
                
        }   
             
    };     
   
    new Thread()   
        {  
            @Override  
        public void run()  
        {     
                   // handler.post(runnableUi);     
                          
                    try{  
                          
                         Log.d(TAG, "######################start###############################");  
                         handler. sendEmptyMessage (0); / UI 스 레 드 외 에 UI 스 레 드 를 업데이트 하려 고 합 니 다.  
                         Log.d(TAG, "######################end###############################");  
                    }  
               catch(Exception e)  
                   {  
                       Log.d(TAG, "***************************"+e.toString());  
                   }  
                      
         }  
       }.start();  
[html] 
copy
view plain
3, 솔 루 션 2 < / span > < / strong >  
[html] 
copy
view plain
Runnable   runnableUi=new  Runnable(){    
        @Override    
        public void run() {    
            //업데이트 인터페이스    
            textView.setText("the Content is:"+content);    
        }    
            
    };    
  new Thread(){    
                public void run(){      
                    content=df.downLoadFiles();         
                    handler.post(runnableUi);     
                    }                       
            }.start();  
4. 함수 가방 을 도입 할 때 잘못된 가방 을 도입 하지 않도록 주의 하 세 요.
 
             import android. os. Handler; / 올 바른 가방 입 니 다.
             import java. util. logging. Handler; / 이 가방 이 아니 라 이전 가방 입 니 다.

좋은 웹페이지 즐겨찾기