Android 비동기 작업 설정 시간 초과 handler 업데이트 알림 기능 사용

Android 는 AsyncTask 설정 을 사용 하여 시간 초과 요청 에 대한 주의사항 을 설정 합 니 다.

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 업데이트 알림 기능 을 사용 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기