안 드 로 이 드 인터페이스 리 셋 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; / 이 가방 이 아니 라 이전 가방 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.