Android Handler 사용법 요약

10323 단어 android
방법 1:(자바 습관,안 드 로 이 드 플랫폼 개발 시 이러 면 안 됩 니 다.단일 스 레 드 모델 에 어 긋 나 기 때 문 입 니 다)
안 드 로 이 드 스 레 드 프로 그래 밍 을 처음 접 했 을 때 자바 처럼 다음 코드 로 문 제 를 해결 하려 고 했 습 니 다.   
new Thread( new Runnable() {     
public void run() {
myView.invalidate();
}
}).start();

기능 을 구현 하여 UI 인터페이스 를 새로 고 칠 수 있 습 니 다.그러나 이 는 안 됩 니 다.단일 스 레 드 모델 에 어 긋 나 기 때 문 입 니 다.Android UI 작업 은 스 레 드 가 안전 한 것 이 아니 라 UI 스 레 드 에서 실행 되 어야 합 니 다.
방법 2:(Thread+Handler)
문서 와 apidemo 를 찾 아 본 후에 자주 사용 하 는 방법 은 Handler 를 이용 하여 UI 스 레 드 의 업 데 이 트 를 실현 하 는 것 임 을 알 게 되 었 다.
Handler 는 받 은 메시지 에 따라 UI 업 데 이 트 를 처리 합 니 다.Thread 스 레 드 에서 Handler 메 시 지 를 보 내 UI 업 데 이 트 를 알 립 니 다.
Handler myHandler = new Handler() {  
public void handleMessage(Message msg) {
switch (msg.what) {
case TestHandler.GUIUPDATEIDENTIFIER:
myBounceView.invalidate();
break;
}
super.handleMessage(msg);
}
};

 
class myThread implements Runnable {   
public void run() {
while (!Thread.currentThread().isInterrupted()) {

Message message = new Message();
message.what = TestHandler.GUIUPDATEIDENTIFIER;

TestHandler.this.myHandler.sendMessage(message);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}

이상 방법 demo 보기:http://rayleung.javaeye.com/blog/411860
방법 3:(자바 습관.Android 플랫폼 에서 이렇게 하면 안 됩 니 다.이것 은 Android 의 스 레 드 안전 과 관련 이 있 습 니 다)
안 드 로 이 드 플랫폼 에 서 는 자바 에 있 는 Timer Task 류 를 반복 적 으로 실행 해 야 합 니 다.Timer Task 는 Thread 에 비해 자원 소모 가 더 적 습 니 다.안 드 로 이 드 가 자체 적 으로 가지 고 있 는 AlarmManager 를 사용 하 는 것 을 제외 하고 Timer 타 이 머 를 사용 하 는 것 이 더 좋 은 해결 방법 입 니 다.import java.util.Timer 를 도입 해 야 합 니 다.import java.util.Timer Task;
public class JavaTimer extends Activity {  

Timer timer = new Timer();
TimerTask task = new TimerTask(){
public void run() {
setTitle("hear me?");
}
};

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

timer.schedule(task, 10000);

}
}

 
방법 4:(TimerTask+Handler)
Handler 에 맞 춰 서 timer 기능 을 하 는!
public class TestTimer extends Activity {  

Timer timer = new Timer();
Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
setTitle("hear me?");
break;
}
super.handleMessage(msg);
}

};

TimerTask task = new TimerTask(){
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

timer.schedule(task, 10000);
}
}

 
방법 5:(Runnable+Handler.postDelayed(runnable,time) )
Android 에 서 는 UI 를 정기 적 으로 업데이트 합 니 다. java.util.Timer, java.util.TimerTask,android.os.Handler 조합.실제로 Handler 자체 가 정시 기능 을 제공 했다. 
    private Handler handler = new Handler();  

private Runnable myRunnable= new Runnable() {
public void run() {

if (run) {
handler.postDelayed(this, 1000);
count++;
}
tvCounter.setText("Count: " + count);

}
};

그리고 다른 곳 에서 호출 합 니 다.
handler.post(myRunnable);
handler.post(myRunnable,time);
사례:http://shaobin0604.javaeye.com/blog/515820
====================================================================
지식 포인트 요약 보충:
   많은 안 드 로 이 드 나 자바 개발 초보 자 들 이 Thread,Looper,Handler 와 Message 에 대해 여전히 현혹 되 고 있다.파생 된 것 은 Handler Thread,java.util.concurrent,Task,AsyncTask 이다.현재 시장 에 있 는 책 등 자료 가 이런 문 제 를 언급 하지 않 았 기 때문에 오늘 은 이 문 제 를 더욱 체계 적 으로 요약 한다.저희 가 만 든 Service,Activity,Broadcast 는 모두 메 인 스 레 드 처리 입 니 다.여기 서 UI 스 레 드 로 이해 할 수 있 습 니 다.그러나 일부 시간 이 걸 리 는 작업 을 할 때 예 를 들 어 I/O 가 읽 고 쓴 큰 파일 읽 기와 쓰기,데이터 베이스 작업 과 인터넷 다운로드 가 오래 걸 립 니 다.사용자 인터페이스 를 막 지 않 기 위해 ANR 의 응답 알림 창 이 나타 나 면 이 럴 때 우 리 는 Thread 스 레 드 를 사용 하여 해결 하 는 것 을 고려 할 수 있 습 니 다.
   J2ME 개발 에 종사 한 프로그래머 에 게 Thread 는 간단 합 니 다.직접 익명 으로 재 작성 run 방법 을 만 들 고 start 방법 으로 실행 하면 됩 니 다.또는 Runnable 인터페이스 에서 계승 되 지만 Android 플랫폼 에 서 는 UI 컨트롤 이 스 레 드 보안 유형 으로 설계 되 지 않 았 기 때문에 동기 화 된 메커니즘 을 도입 하여 새로 고침 해 야 합 니 다.이 점 에서 Google 은 Android 를 디자인 할 때 Win 32 의 메시지 처리 체 제 를 참고 하 였 습 니 다.
 1.스 레 드 에 있 는 View 를 기본 으로 하 는 인터페이스 에 대해 서 는 post Invaidate()방법 으로 스 레 드 에서 처리 할 수 있 습 니 다.그 중에서 post Invaidate(int left,int top,int right,int bottom)와 같은 재 작성 방법 도 제공 합 니 다.예 를 들 어 post InvalidateDelayed(long delay Milliseconds)나 post InvalidateDelayed(long delay Milliseconds,int left,int top,int right,int bottom)방법 은 첫 번 째 매개 변 수 는 밀리초 입 니 다.
 2.물론 추천 하 는 방법 은 Handler 를 통 해 이 를 처리 하 는 것 입 니 다.한 라인 의 run 방법 에서 handler 대상 의 postmessage 나 sendmessage 방법 을 호출 하여 실현 할 수 있 습 니 다.Android 프로그램 내부 에 메시지 대기 열 을 유지 하고 있 습 니 다.이 를 교대로 처리 할 것 입 니 다.만약 에 Win 32 프로그래머 라면 이 메시지 처 리 를 잘 이해 할 수 있 습 니 다.하지만 안 드 로 이 드 에 비해 PreTranslateMessage 같은 내부 간섭 방법 은 제공 되 지 않 았 다.
3.로 퍼 는 또 무엇 일 까?사실 Android 의 모든 Thread 는 하나의 Looper 를 따 릅 니 다.Looper 는 Thread 가 메시지 대기 열 을 유지 하 는 데 도움 을 줄 수 있 습 니 다.그러나 Looper 는 Handler 와 아무런 관계 가 없습니다.우 리 는 오픈 소스 코드 에서 Android 를 볼 수 있 고 Thread 계승 클래스 인 HanderThread 를 제공 하여 처리 할 수 있 습 니 다.HandlerThread 대상 에서 getLooper 방법 을 통 해 Looper 대상 제어 핸들 을 얻 을 수 있 습 니 다.우 리 는 이 Looper 대상 을 Handler 에 투사 하여 스 레 드 동기 화 체 제 를 실현 할 수 있 습 니 다.Looper 대상 의 실행 은 Looper.prepare 방법 을 초기 화 하 는 것 이 바로 어제 우리 가 본 문제 입 니 다.또한 출시 할 때 자원 을 방출 하고 Looper.release 방법 을 사용 해 야 합 니 다.
4.Message 는 Android 에서 무엇 일 까요?Android 에서 Handler 는 일부 내용 을 전달 할 수 있 습 니 다.Bundle 대상 을 통 해 String,Integer,Blob 바 이 너 리 대상 을 봉인 할 수 있 습 니 다.저 희 는 스 레 드 에서 Handler 대상 의 sendEmpty Message 나 sendmessage 방법 을 사용 하여 Bundle 대상 을 Handler 프로세서 로 전달 합 니 다.Handler 클래스 에 재 작성 방법 handleMessage(Message msg)를 제공 합 니 다. msg.what 를 통 해 모든 정 보 를 구분 합 니 다.Bundle 패 키 지 를 풀 어 Handler 클래스 가 UI 스 레 드 의 내용 을 업데이트 하여 컨트롤 의 리 셋 작업 을 실현 합 니 다.관련 Handler 대상 의 메 시 지 를 보 내 는 sendXXXX 와 관련 된 방법 은 다음 과 같 습 니 다.또한 post XXXX 와 관련 된 방법 도 있 습 니 다.이것 은 Win 32 의 이치 와 대체적으로 일치 합 니 다.하 나 는 보 낸 후에 바로 돌아 가 고 하 나 는 처리 한 후에 돌아 갑 니 다.
5.java.util.concurrent 대상 분석 에 따 르 면 과거 자바 개발 에 종사 한 프로그래머 가 Concurrent 대상 에 대해 낯 설 지 않 겠 지 요?그 는 JDK 1.5 이후 에 추 가 된 중요 한 특성 을 손바닥 장치 로 사용 하 는 것 을 권장 하지 않 습 니 다.우 리 는 안 드 로 이 드 가 우리 에 게 이미 설계 한 Task 체 제 를 고려 하여 여 기 는 너무 많은 설명 을 하지 않 습 니 다.관련 원인 은 아래 의 소 개 를 참고 하 십시오.
6.안 드 로 이 드 에 서 는 스 레 드 와 다른 처리 방식 도 제공 합 니 다.바로 Task 와 AsyncTask 입 니 다.소스 코드 에서 볼 수 있 듯 이 Concurrent 를 위 한 패 키 징 입 니 다.개발 자 들 은 이러한 비동기 임 무 를 편리 하 게 처리 할 수 있 습 니 다.
발췌 자:http://www.cnblogs.com/playing/archive/2011/03/24/1993583.html

좋은 웹페이지 즐겨찾기