Android 스 레 드 는 UI --- Thread Handler Looper Timer Task 등 을 업데이트 하 는 데 사 용 됩 니 다.
안 드 로 이 드 스 레 드 프로 그래 밍 을 처음 접 했 을 때 자바 처럼 다음 코드 로 문 제 를 해결 하려 고 했 습 니 다.
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: (자바 습관, 추천 하지 않 음)
안 드 로 이 드 플랫폼 에 서 는 자바 에 있 는 Timer Task 류 를 반복 적 으로 실행 해 야 합 니 다. Timer Task 는 Thread 에 비해 자원 소모 가 더 낮 습 니 다. 안 드 로 이 드 자체 가 가지 고 있 는 AlarmManager 를 사용 하 는 것 외 에 Timer 타 이 머 를 사용 하 는 것 이 더 좋 은 해결 방법 입 니 다. import 자바. util. Timer 를 도입 해 야 합 니 다. import 자바. util. Timer Task 와 import 자바. 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 에 여전히 현혹 되 어 있다. 파생 된 것 은 HandlerThread, java. util. concurrent, Task, AsyncTask 이다. 현재 시중 에 나 와 있 는 책 등 자료 가 언급 되 지 않 았 기 때문에 오늘 은 이 문제 에 대해 더욱 체계 적 인 정 리 를 한다. 우리 가 만 든 Service, Activity, Broadcast 는 모두 하나의 주인 이다.스 레 드 처리, 여기 서 는 UI 스 레 드 로 이해 할 수 있 습 니 다. 그러나 I / O 가 읽 고 쓴 큰 파일 읽 기와 쓰기, 데이터 베이스 작업 과 네트워크 다운로드 등 시간 이 오래 걸 립 니 다. 사용자 인터페이스 를 막 지 않 기 위해 ANR 의 응답 알림 창 이 나타 나 면 Thread 스 레 드 를 사용 하여 해결 하 는 것 을 고려 할 수 있 습 니 다.
J2ME 개발 에 종사 한 프로그래머 에 게 Thread 는 간단 합 니 다. 익명 으로 재 작성 run 방법 을 만 들 거나 start 방법 으로 실행 하면 됩 니 다. 또는 Runnable 인터페이스 에서 계승 되 지만 Android 플랫폼 에 서 는 UI 컨트롤 이 스 레 드 보안 유형 으로 설계 되 지 않 았 기 때문에 동기 화 된 메커니즘 을 도입 하여 새로 고침 해 야 합 니 다. 이 점 은 Google 이 Android 를 디자인 할 때 W 를 참고 하 였 습 니 다.in32 메시지 처리 메커니즘.
1. 스 레 드 에서 View 를 기본 클래스 로 새로 고침 하 는 인터페이스 에 대해 서 는 post Invaidate () 방법 으로 스 레 드 에서 처리 할 수 있 습 니 다. 그 중에서 post Invaidate (int left, int top, int right, int bottom) 와 같은 재 작성 방법 도 제공 합 니 다. 예 를 들 어 post Invaidate Delayed (long delay Milliseconds) 나 post Invaidate Delayed 등 입 니 다.(long delay Milliseconds, int left, int top, int right, int bottom) 방법 중 첫 번 째 매개 변 수 는 밀리초 입 니 다.
2. 물론 추천 하 는 방법 은 Handler 를 통 해 이 를 처리 하 는 것 입 니 다. 한 라인 의 run 방법 에서 handler 대상 의 postmessage 나 sendmessage 방법 을 호출 하여 실현 할 수 있 습 니 다. Android 프로그램 내부 에 메시지 대기 열 을 유지 하고 있 습 니 다. 이 를 교대로 처리 합 니 다. Win 32 프로그래머 라면 이 메시지 처 리 를 잘 이해 할 수 있 지만 Android 에 비해 PreT 를 제공 하지 않 았 습 니 다.ranslateMessage 내부 간섭 하 는 방법 들
3. Looper 는 또 무엇 일 까요? 사실 Android 의 모든 Thread 는 하나의 Looper 를 따 릅 니 다. Looper 는 Thread 가 메시지 큐 를 유지 하 는 데 도움 을 줄 수 있 습 니 다. 그러나 Looper 는 Handler 와 아무런 관계 가 없습니다. 우 리 는 오픈 소스 코드 에서 Android 를 볼 수 있 고 Thread 계승 클래스 인 HanderThread 를 제공 하여 처리 할 수 있 습 니 다. Handler Thread 대상 에서 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 클래스 에 대해 재 작성 방법 handle Message 를 제공 합 니 다.(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 를 위 한 패 키 징 입 니 다. 개발 자 들 은 이러한 비동기 임 무 를 편리 하 게 처리 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.