안 드 로 이 드 개발 노트 Handler 사용 총화

4296 단어 Handler
1.Handler 의 정의:
주로 하위 스 레 드 에서 보 낸 데 이 터 를 받 아들 이 고 이 데이터 로 메 인 스 레 드 에 맞 춰 UI 를 업데이트 합 니 다.
설명:프로그램 이 시 작 될 때 Android 는 먼저 메 인 스 레 드(즉 UI 스 레 드)를 엽 니 다.메 인 스 레 드 는 관리 인터페이스의 UI 컨트롤 로 이벤트 배 포 를 합 니 다.예 를 들 어 Button 을 클릭 하면 Android 는 이 벤트 를 Button 에 나 누 어 주 고 작업 에 응답 합 니 다.만약 에 이때 시간 이 걸 리 는 작업 이 필요 하 다 면 예 를 들 어 인터넷 에서 데 이 터 를 읽 거나 로 컬 에서 비교적 큰 파일 을 읽 을 때 이런 작업 을 메 인 스 레 드 에 두 면 안 된다.만약 에 메 인 스 레 드 에 두 면 인터페이스 에 가사 현상 이 나타 날 것 이다.만약 에 5 초 동안 완성 되 지 않 았 다 면...안 드 로 이 드 시스템 에서"강제 종료"라 는 오류 알림 을 받 을 수 있 습 니 다.이 럴 때 우 리 는 이러한 시간 이 걸 리 는 동작 을 하위 스 레 드 에 두 어야 합 니 다.하위 스 레 드 는 UI 업데이트 와 관련 되 기 때문에 안 드 로 이 드 메 인 스 레 드 는 안전 하지 않 습 니 다.즉,UI 업 데 이 트 는 메 인 스 레 드 에서 만 업데이트 되 고 하위 스 레 드 에서 만 작 동 하 는 것 은 위험 합 니 다.이 럴 때,Handler 는 이 복잡 한 문 제 를 해결 하기 위해 발생 했 습 니 다.Handler 는 메 인 스 레 드(UI 스 레 드)에서 실행 되 기 때문에 하위 스 레 드 와 Message 대상 을 통 해 데 이 터 를 전달 할 수 있 습 니 다.이때 Handler 는 하위 스 레 드 에서 전 달 된(하위 스 레 드 는 sedMessage()방법 으로 동생 에 게 전 달 된)Message 대상 을 담당 하고(데이터 포함)이 메 시 지 를 메 인 스 레 드 대기 열 에 넣 습 니 다.메 인 스 레 드 에 맞 춰 UI 를 업데이트 합 니 다.
2.Handler 의 특징
handler 는 Message 대상 과 Runnable 대상 을 주 스 레 드 에 나 누 어 줄 수 있 습 니 다.모든 Handler 인 스 턴 스 는 그 를 만 드 는 스 레 드 에 연결 되 어 있 습 니 다(일반적으로 주 스 레 드 에 있 습 니 다).
이것 은 두 가지 역할 이 있 습 니 다.(1)메시지 나 Runnable 을 특정한 메 인 스 레 드 에서 어느 곳 에서 실행 하도록 설정 합 니 다.(2)다른 스 레 드 에서 동작 을 수행 하도록 설정 합 니 다.
Handler 에서 메 시 지 를 전달 하 는 방법 들.
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
이상 post 클래스 방법 은 Runnable 대상 을 메 인 라인 대기 열 에 배열 할 수 있 습 니 다.
sendmessage 클래스 방법,데 이 터 를 가 진 Message 대상 을 대기 열 에 배치 하여 업 데 이 트 를 기다 릴 수 있 습 니 다.
3.Handler 인 스 턴 스
(1)하위 클래스 는 Handler 클래스 를 계승 하고 handleMessage(Message msg)방법 을 다시 써 서 스 레 드 데 이 터 를 받 아들 여야 합 니 다.
다음은 하나의 인 스 턴 스 입 니 다.이 기능 은 스 레 드 를 통 해 인터페이스 Button 의 내용 을 수정 하 는 것 입 니 다.
 
public class MyHandlerActivity extends Activity {
Button button;
MyHandler myHandler;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handlertest);
button = (Button) findViewById(R.id.button);
myHandler = new MyHandler();
// Handler , ,
// Handler , (1) : Message Runnalbe
// (2): , .
// ,
// post(Runnable)
// postAtTime(Runnable,long)
// postDelayed(Runnable,long)
// sendEmptyMessage(int)
// sendMessage(Message);
// sendMessageAtTime(Message,long)
// sendMessageDelayed(Message,long)
// post Runnable
//sendMessage() Message (Message ,)
MyThread m = new MyThread();
new Thread(m).start();
}
/**
* , , Handler
* */
class MyHandler extends Handler {
public MyHandler() {
}
public MyHandler(Looper L) {
super(L);
}
// ,
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Log.d("MyHandler", "handleMessage......");
super.handleMessage(msg);
// UI
Bundle b = msg.getData();
String color = b.getString("color");
MyHandlerActivity.this.button.append(color);
}
}
class MyThread implements Runnable {
public void run() {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("thread.......", "mThread........");
Message msg = new Message();
Bundle b = new Bundle();//
b.putString("color", " ");
msg.setData(b);
MyHandlerActivity.this.myHandler.sendMessage(msg); // Handler , UI
}
}

좋은 웹페이지 즐겨찾기