안드로이드 멀티 스레딩 : HandlerThread 이해하고 사용 요약

HandlerThread에서 A, 안드로이드

1.1 주요 역할

그리고 다른 데이터는 몇 초마다 또는 사진을 업데이트했습니다.

1.2 원리

상속 스레드, 실제로 루퍼, 핸들러의 스레드입니다.

  1. 에서 스레드 상속 run()에 의해 처리 Looper.prepare()하는 메시지 큐를 작성하는 Looper.loop()메시지를 처리하는 루프.
  2. 열린 HandlerThread를 사용하는 경우, 자벌레, 특정 작업을 수행하는 핸들러 메시지 알림 HandlerThread 방법의 결합 처리기 및 HandlerThread을 만들 수 있습니다.

1.3 특징

내부 HandlerThread를 반복하지 않도록 만들고 운영 자식 스레드를 파괴하는 메시지 큐를 유지한다.

두, HandlerThread 사용

2.1 HandlerThread 사용 단계

(1) HandlerThread 인스턴스를 생성하는 매개 변수 문자열의 이름은 새로운 스레드를 정의한다.

 

HandlerThread mHandlerThread = new HandlerThread("check-message-coming");

(2) 시작 HandlerThread 스레드.

 

mHandlerThread.start(); 

(3) 핸들러 객체를 생성 HandlerThread Lopper는 파라미터로서, 이와의 결합 루퍼 오브젝트 핸들러 객체 HandlerThread 완료 (여기 핸들러 객체 바인딩 HandlerThread 자식 스레드로 간주 동작 handlerMessage 그렇게 할 수 그것은) 하위 스레드에서 실행됩니다. HandleMessage 공정 시간이 많이 걸리는 작업을 재 작성.

 

Handler mCheckMsgHandler = new Handler(mHandlerThread.getLooper()){
     @Override
     public void handleMessage(Message msg){
         // 进行耗时操作
     }
};

완료 핸들러가 UI를 업데이트하는 메인 스레드로 전환 할 수 있습니다 후 mCheckMsgHandler가, 시간이 많이 걸리는 작업을 수행 할 수 있도록 우리는 메시지 오브젝트를 처리 할 수있다.

2.2 HandlerThread 사용 예

단계에 따라 단지 초당 데이터를 업데이트하는 기능을 구현하기 위해,이 기능은 상품 가격을 주식을 업데이트 할 수 있습니다.

  1. 만들고 HandlerThread, 핸들러 바인딩 시작 : 새로운 활동의 onCreate()사용의 행위 initBackThread()만든 HandlerThread 방법. 스위칭 동작이 완료된 후에 얻어진 시뮬레이션을 시작하기 위해 기다리고 MCheckMsgHandler 메시지가 UI 스레드에 UI를 갱신하는데 걸리는 메인 쓰레드 핸들러는 동일하다.

 

    private void initBackThread(){
        // 1.创建HandlerThread
        mHandlerThread = new HandlerThread("check-message-coming");
        // 2.启动HandlerThread线程
        mHandlerThread.start();
        // 3.创建Handler对象绑定该线程的Looper
        mCheckMsgHandler = new Handler(mHandlerThread.getLooper()){
            @Override
            public void handleMessage(Message msg){
                //模拟耗时操作
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                // 主线程更新数据
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        String result = "每隔1秒更新一下数据:"+Math.random();
                        mInfoText.setText(result);
                    }
                });

                if(isUpdate){ //1s后再次发送消息进行耗时操作
                    mCheckMsgHandler.sendEmptyMessageDelayed(MSG_UPDATE_INFO, 1000);
                }
            }
        };
    }
  1. 버튼 바인딩 처리기를 사용하여 메시지를 보낼 : 시작 버튼을 mCheckMsgHandler 시간이 많이 걸리는 작업에 메시지를 보내, 다른 버튼은 메시지 전송을 중지합니다. 마크 isUpdate 다시 메시지 업데이트를 보낼 수 있는지 여부.

 

        mInfoText = (TextView) findViewById(R.id.tv_info_count);
        findViewById(R.id.btn_start).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //开始更新
                isUpdate = true;
                mCheckMsgHandler.sendEmptyMessage(MSG_UPDATE_INFO);
            }
        });

        findViewById(R.id.btn_stop).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //停止更新
                isUpdate = false;
                mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);
            }
        });
  1. 기억 onPause()onDestroy()일시 정지 및 해제 메모리에 mHandlerThread 업데이트를 중지합니다.

 

    @Override
    protected void onPause() {
        super.onPause();
        isUpdate = false;
        mCheckMsgHandler.removeMessages(MSG_UPDATE_INFO);
    }

    @Override
    protected void onDestroy(){
        super.onDestroy();
        //释放资源
        mHandlerThread.quit();
    }

관련 기사 :
안드로이드 멀티 스레딩이 : 이해하고 간단한 요약 사용하는
것을 사용되는, 타이머 대 처리기를?

재판 : https://www.jianshu.com/p/a03ef2a0c026

게시 49 개 원래 기사 · 원 찬양 2 · 조회수 8588

추천

출처blog.csdn.net/yangjunjin/article/details/105030711