Android 비동기 작업 설정 시간 초과 handler 업데이트 알림 기능 사용
6638 단어 androidhandler시간 을 초과 하 다
final AsyncTaskTools task = new AsyncTaskTools(dialog, doTask, result, context);
mTask.execute(" ");
new Thread() {
public void run() {
try {
/**
* ,
* : , UI
* onPreExecute()
*/
mTask.get(10000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
Log.e(TAG, " 1");
} catch (ExecutionException e) {
e.printStackTrace();
Log.e(TAG, " 2");
} catch (TimeoutException e) {
e.printStackTrace();
Log.e(TAG, " 3");
/**
* doInBackground 10 ,
* ,
* : UI , UI , handler, handler handler
* UI
*/
Message message = new Message();
message.what = 0;
mHandler.sendMessage(message);
}
}
}.start();
2.handler 상세 설명하나의 Handler 는 메시지(Message)와 스 레 드 메시지 큐 와 연 결 된 Runnable 대상 을 보 내 고 처리 할 수 있 습 니 다.모든 Handler 인 스 턴 스 는 하나의 스 레 드 와 이 스 레 드 의 메시지 큐 와 관련 이 있 습 니 다.새 Handler 를 만 들 면 스 레 드/메시지 큐 를 만 드 는 것 과 연 결 됩 니 다.그 후에 메시지 와 runnable 대상 이 메시지 큐 에 전달 하고 실행 합 니 다.
Handler 를 사용 해 야 하 는 이 유 는 두 가지 가 있 습 니 다.
(1)미래의 어느 시점 에 메시지 와 runnable 대상 을 스케줄 링 합 니 다.
(2)수행 해 야 할 작업 을 자신의 것 이 아니 라 다른 스 레 드 에 넣 습 니 다.
스케줄 링 처리 메 시 지 는 post(Runnable),postAtTime(Runnable,long),postDelayed(Runnable,long),sendEmptyMessage(int),sendMessage(Message),sendMessageAtTime(Message,long),sendMessageDelayed(Message,long)등 을 호출 하 는 방법 으로 이 루어 졌 다.이 중 post 버 전의 방법 은 Runnable 대상 을 메시지 큐 에 넣 을 수 있 습 니 다.sendmessage 버 전의 방법 은 bundle 대상 이 포 함 된 메시지 대상 을 메시지 대기 열 에 넣 고 handleMessage(Message)방법 으로 처리 할 수 있 습 니 다.(이것 은 Handler 의 handle Message 방법 을 복사 해 야 합 니 다)
Handler 는 실제 개발 에서 자주 사용 되 는데 주로 하위 스 레 드 에서 보 낸 데 이 터 를 수신 한 다음 에 메 인 스 레 드 가 이 데 이 터 를 결합 하여 인터페이스 UI 를 업데이트 합 니 다.
안 드 로 이 드 프로그램 이 시 작 될 때 그 는 메 인 스 레 드(즉 UI 스 레 드)를 열 어 인터페이스 에 있 는 UI 컨트롤 을 관리 하고 이벤트 파 티 를 합 니 다.예 를 들 어 단 추 를 누 르 면 안 드 로 이 드 는 이 벤트 를 Button 에 나 누 어 동작 에 응답 합 니 다.그러나 시간 이 걸 리 는 작업 을 수행 해 야 한다 면,예 를 들 어 IO 작업,네트워크 통신 등 이 있 습 니 다.실행 시간 이 5s 를 넘 으 면 안 드 로 이 드 는'클래식'ANR 무 응답 대화 상 자 를 팝 업 하고'Force quit'또는'Wait'를 누 르 는 것 을 알려 줍 니 다.이런 문 제 를 해결 하 는 방법 은 바로 우리 가 시간 이 걸 리 는 조작 을 하위 스 레 드 에 넣 어 실행 하 는 것 이다.그러나 하위 스 레 드 는 UI 업데이트 와 관련 되 어 있 으 며,Android 메 인 스 레 드 는 스 레 드 가 안전 하지 않 기 때문에 UI 를 업데이트 하 는 작업 은 메 인 스 레 드 에 만 실 행 될 수 있 습 니 다.하위 스 레 드 에 두 고 실행 하면 문제 가 발생 할 수 있 습 니 다.그래서 이 때 는 하나의 메커니즘 이 필요 합 니 다.메 인 스 레 드 는'명령/작업'을 보 내 서 하위 스 레 드 에 실행 결 과 를 피드백 할 수 있 습 니 다.
하나,무엇이 handler 입 니까?
답:handler 는 Android 가 우리 에 게 UI 를 업데이트 하 는 데 사용 하 는 메커니즘 이자 메시지 처리 메커니즘 입 니 다.우 리 는 메 시 지 를 보 낼 수도 있 고 이 를 통 해 메 시 지 를 처리 할 수도 있 습 니 다.
2.그런데 왜 handler 를 사용 합 니까?안 써 도 돼 요?
답:내 가 인터넷 에서 찾 아 봤 는데 내 게 준 답 은 틀림없이 안 될 거 야.안 드 로 이 드 는 디자인 할 때 메 시 지 를 만 들 고 전달 하 며 처리 하기 때 문 입 니 다.따 르 지 않 으 면 UI 정 보 를 업데이트 할 수 없 으 며,이상 을 보고 합 니 다.
3.Android 는 왜 handler 메커니즘 으로 만 UI 를 업데이트 할 수 있 도록 설계 해 야 합 니까?
답:가장 근본 적 인 목적 은 다 중 스 레 드 병발 문 제 를 해결 하기 위해 서 입 니 다!
예 를 들 어 하나의 activity 에 여러 개의 스 레 드 가 있 고 자 물 쇠 를 추가 하지 않 으 면 인터페이스 가 어 지 러 운 문제 가 발생 할 수 있다.그러나 이러한 업데이트 UI 작업 에 잠 금 처 리 를 하면 성능 이 떨 어 질 수 있다.
성능 에 대한 문 제 를 고려 할 때 안 드 로 이 드 는 우리 에 게 UI 를 업데이트 하 는 메커니즘 을 제공 합 니 다.우 리 는 이런 메커니즘 만 따 르 면 됩 니 다.다 중 스 레 드 와 관련 된 문 제 를 제거 하지 않 아 도 됩 니 다.모든 업데이트 UI 작업 은 메 인 스 레 드 메시지 큐 에서 교대 훈련 을 합 니 다.
4.handler,Looper,Message Queue 의 원 리 는 무엇 입 니까?
답:handler 의 역할 은 두 가지 가 있다 는 것 을 잘 알 고 있 습 니 다.메 시 지 를 보 내 고 메 시 지 를 처리 합 니 다.handler 가 보 낸 메 시 지 는 지정 한 Message Queue(메시지 대기 열)로 보 내야 합 니 다.즉,handler 가 정상적으로 작 동 하려 면 Message Queue(메시지 대기 열)가 있어 야 하지만 Message Queue(메시지 대기 열)는 Looper 에 의 해 관 계 됩 니 다.그래서 handler 를 정상적으로 일 하 게 하려 면 현재 스 레 드 에 Looper 대상 이 있어 야 합 니 다.(열심히 읽 으 세 요)
1.Looper 가 제공 하 는 구조 기 소스 코드 를 살 펴 보 겠 습 니 다.그림 과 같 습 니 다.
이 구조 기 는 private(사유 화)를 사용 하 는 것 을 발견 할 수 있 습 니 다.프로그래머 에 게 구조 적 방법 으로 looper 대상 을 만 들 수 없다 는 것 을 알려 드 립 니 다.방법 에서 Looper 는 관련 된 Message Queue 를 만 들 었 습 니 다.이 Message Queue 는 Message(handler 가 받 고 처리 하 는 메시지 대상)를 관리 하 는 것 입 니 다!
2.현재 스 레 드 에 Looper 대상 이 있 도록 두 가지 상황 으로 처리 할 수 있 습 니 다.(미 친 안 드 로 이 드 강의 224 쪽)
(1)주 ui 스 레 드 가 시작 되면 시스템 은 Looper 대상 을 초기 화 합 니 다.프로그램 에서 handler 를 직접 만 들 면 됩 니 다.그리고 handler 로 메 시 지 를 보 내 고 처리 합 니 다.
(2)프로그래머 가 직접 만 든 스 레 드 입 니 다.이 럴 때 는 수 동 으로 Looper 대상 을 만 들 고 Looper 대상 을 만 들 고 prepare()를 호출 해 야 합 니 다.prepare()방법 은 모든 스 레 드 에서 최대 하나의 Looper 대상 을 확보 하기 위해 서 입 니 다.
prepare()방법 원본 은 그림 과 같다.
그리고 Looper.loop()으로 시작 합 니 다.이때 loop()방법 은 Message Queue()의 메 시 지 를 끊임없이 꺼 내 고 해당 하 는 Handler 에 메 시 지 를 나 누 어 처리 합 니 다.
정리 해 보 세 요.
-1:Looper 의 역할:모든 스 레 드 에 하나의 Looper 만 있 습 니 다.그 는 Message Queue 를 관리 하고 Message Queue 에서 메 시 지 를 꺼 내 대상 에 게 나 누 어 주 는 handler 입 니 다.
-2:Message Queue 의 역할:Looper 에서 관리 하고 Message Queue 는 선진 적 인 방법 으로 Message 를 관리 합 니 다!
-3:Handler 의 역할:Looper 가 관리 하 는 Message Queue 에 메 시 지 를 보 내 고 Looper 가 그 에 게 보 낸 메 시 지 를 처리 합 니 다.
6.Android 가 하위 스 레 드 에서 UI 를 업데이트 하 는 가장 흔 한 다섯 가지 방식
1.runOnUiThread()방법
2.handler.post()방법
3.handler.sendMessage()방법
4.view.post()방법.
5、view postDelayed(Runnable,long)
총결산
위 에서 말 한 것 은 편집장 이 소개 한 안 드 로 이 드 비동기 퀘 스 트 설정 이 시간 을 초과 하여 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에 따라 라이센스가 부여됩니다.