Android 개발 의 하위 스 레 드 UI 를 조작 하 는 몇 가지 방법

Android 프로젝트 에 서 는 이러한 문제 가 자주 발생 합 니 다.하위 스 레 드 에서 시간 소모 작업 을 마 친 후에 UI 를 업데이트 해 야 합 니 다.다음은 자신 이 겪 은 프로젝트 에 대해 업데이트 방법 을 정리 하 겠 습 니 다.
방법 을 보기 전에 안 드 로 이 드 의 메시지 메커니즘 을 알 아야 한다.
방법 1 Activity.runOnUiThread
방법 은 다음 과 같다.

runOnUiThread(new Runnable() { 
@Override 
public void run() { 
tv.setText("Hello"); 
} 
}); 
이 방법 은 간단 하고 사용 하기 쉬 우 며,현재 스 레 드 가 UI 스 레 드 라면 즉시 실행 합 니 다.현재 스 레 드 가 UI 스 레 드 가 아니라면 이벤트 대기 열의 UI 스 레 드 에 발 표 됩 니 다.사실 Handler 와 차이 가 많 지 않 습 니 다.UI 업데이트 요청 메 시 지 를 이벤트 대기 열 에 추가 하고 메 인 프로그램 이 비어 있 을 때 실 행 됩 니 다.
방법 2 Handler
메 인 스 레 드 에서 Handler 를 다음 과 같이 정의 합 니 다.

Handler mHandler = new Handler() { 
@Override 
public void handleMessage(Message msg) { 
super.handleMessage(msg); 
switch (msg.what) { 
case 0: 
String data = (String)msg.obj; 
textView.setText(data); 
break; 
default: 
break; 
} 
} 
}; 
하위 스 레 드 에서 메 시 지 를 보 내 고 Handler 에 게 UI 업 데 이 트 를 완료 하 라 고 알 립 니 다.코드 는 다음 과 같 습 니 다.

new Thread(new Runnable(){ 
@Override 
public void run() { 
//     
mHandler.sendEmptyMessage(0); 
Message msg =new Message(); 
msg.obj = "  ";//       ,     ,   List、map  
mHandler.sendMessage(msg); 
} 
}).start(); 
방법 3 View.post

final Button btn =(Button)findViewById(R.id.btn); 
btn.post(new Runnable(){ 
@Override 
publicvoid run() { 
btn.setText("Hello"); 
} 
}); 
위의 코드 는 btn 의 내용 을 업데이트 하 는 것 이 고 아래 코드 도 이런 효 과 를 얻 을 수 있 습 니 다.

Handler handler = new Handler(); 
final Button btn = (Button)findViewById(R.id.btn); 
handler.post(new Runnable(){ 
@Override 
public void run() { 
btn.setText("Hello"); 
} 
}); 
이것 은 handler.post 방법 을 사용 하 는 것 입 니 다.하 나 는 View.post 방법 을 사용 하 는 것 입 니 다.handler.post 방법 은 이미 안 드 로 이 드 메시지 체제 에서 소개 되 었 습 니 다.사실은 최종 적 으로 방법 2 중의 send 방법 을 호출 했 습 니 다.
이제 View.post 방법의 소스 코드 를 살 펴 보 겠 습 니 다.

public boolean post(Runnable action) { 
Handler handler; 
AttachInfo attachInfo = mAttachInfo; 
if (attachInfo != null) { 
handler = attachInfo.mHandler; 
} else { 
// Assume that post will succeed later 
ViewRootImpl.getRunQueue().post(action); 
return true; 
} 
return handler.post(action); 
} 
방법 에서 주요 기능 코드 는 attachInfo.mHandler 입 니 다.현재 스 레 드(즉 UI 스 레 드)의 Hanlder 를 가 져 온 다음 action 대상 post 를 Handler 에 가 져 옵 니 다.Handler 의 처리 과정 에서 링크 문 은 전 달 된 action 대상 을 Message(Message 의 callback 을 action)로 포장 한 다음 UI 스 레 드 의 메시지 순환 에 투입 합 니 다.Handler 의 dispatchMessage 방법 에서 첫 번 째 말 은 runnable 의 run 방법 을 직접 호출 하 는 것 입 니 다.이 때 는 UI 스 레 드 로 연결 되 어 있 기 때문에 걱정 없 이 UI 를 업데이트 할 수 있 습 니 다.
방법 4 방송
서브 스 레 드 에서 방송 을 보 내 고 메 인 스 레 드 에서 방송 을 받 으 며 UI 를 업데이트 합 니 다.
방법 5 AsyncTask 사용
하위 스 레 드 에서 UI 에 접근 하 는 것 을 간소화 하기 위해 시스템 은 AsyncTask 를 제공 합 니 다.
AsyncTask 는 경량급 비동기 작업 클래스 로 온라인 스 레 드 에서 배경 작업 을 수행 한 다음 에 실행 진도 와 결 과 를 메 인 스 레 드 에 전달 하고 UI 를 업데이트 할 수 있 습 니 다.본질 적 으로 AsyncTask 는 Thread 와 Handler 를 봉 인 했 지만 AsyncTask 는 특별히 시간 이 걸 리 는 배경 작업 에 적합 하지 않 습 니 다.특별히 시간 이 걸 리 는 작업 이 필요 하 다 면 스 레 드 탱크 를 사용 하 는 것 을 권장 합 니 다.
서로 다른 API 버 전의 AsyncTask 는 서로 다른 표현 을 가지 고 있 기 때문에 주의해 야 한다.편폭 을 통제 하기 위해 구체 적 인 AsyncTask 의 사용 방법 과 작업 원 리 를 뒤에 단독으로 소개 할 계획 입 니 다.
위 에서 말 한 것 은 소 편 이 여러분 에 게 소개 한 안 드 로 이 드 개발 의 하위 스 레 드 조작 UI 의 몇 가지 방법 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 저 에 게 메 시 지 를 남 겨 주세요.소 편 은 제때에 답 해 드 리 겠 습 니 다!

좋은 웹페이지 즐겨찾기