Android 지식 포인트 요약(13)Handler, Looper 메시지 대기열 모델, 각 부분의 역할

5382 단어 andriod
관련 기사:
Android 지식 포인트 요약(목차)https://blog.csdn.net/a136447572/article/details/81027701、
Handler는 당신에게 메시지와 Runnable 대상을 보내고 처리할 수 있습니다.각 Handler 객체는 Thread 및
Thread 메시지 대기열Handler를 만들 때 Thread 메시지 대기열과 연결되면 됩니다.
메시지와runnable 대상을 메시지 대기열에 전달하고 메시지를 실행한 후 메시지 대기열에서 종료합니다.
Handler의 역할은 메시지와runnable 대상이 실행되는 것을 조정하는 것이다.동작을 다른 라인에서 실행시키다.
프로그램에서 프로세스가 생성되었을 때, 주 루틴은 메시지 대기열 (messageQueue) 을 실행합니다.
맨 윗부분의 응용 프로그램과 관련된 대상, 예를 들어activity,broadcastReceiver,windows 등은 당신을 만들 수 있습니다.
의 Thread, 메인 라인과 상호작용을 하는Handler를 통해 상호작용을 하는 방법은post나sendMessage를 통해 하는 것이다.
그러나 새로운 라인에서 주어진 메시지나 Runnable는 적당한 시기에 스케줄링되고 처리됩니다.
(즉, 즉각 처리되지 않는 막힘식).
루틴에서 looper가 전송되지 않음

        handler.sendEmptyMessage(0x11);// 

        Message msg = new Message();
        Bundle bundle = new Bundle();
        bundle.putString("key","value");
        msg.setData(bundle);
        msg.what = 0x12 ;
        handler.sendMessage(msg); // 

Handler 정의
    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == 0x11){
                Log.i("info"," ");
            }
            if (msg.what == 0x12){
                Bundle bundle = msg.getData();
                String value = bundle.getString("key");
                Log.i("info","value="+value );
            }
        }
    };

Thread와HandlerThread의 차이
Thread에 looper Handler Thread가 없습니다. 시스템에서 기본적으로 Looper를 만들면Handler를 통해 메시지를 전달할 수 있습니다.
하위 스레드를 만드는 Handler
 HandlerThread handlerThread = new HandlerThread("HandlerThread");
        handlerThread.start();

        Handler mHandler = new Handler(handlerThread.getLooper()){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.what==0x11){

                    new Timer().schedule(new TimerTask() {
                        @Override
                        public void run() {
                            ss++;
                            //    Handler 
                            Message msgd = new Message();
                            Bundle bundle = new Bundle();
                            bundle.putString("key",""+ss);
                            msgd.setData(bundle);
                            msgd.what = 0x12 ;
                            zHandler.sendMessage(msgd);   
                        }  
                    }, 1000,1000);


                }
            }
        };

        mHandler.sendEmptyMessage(0x11);

주 스레드의Handler

  Handler zHandler = new Handler(){
         @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            if (msg.what == 0x12){
                Bundle bundle = msg.getData();
                String value = bundle.getString("key");
                text1.setText(value+"");
            }

        }
    };

좋은 웹페이지 즐겨찾기