美文网首页性能优化
你知道android的MessageQueue.IdleHand

你知道android的MessageQueue.IdleHand

作者: 菜鸟何时起飞 | 来源:发表于2019-01-15 17:04 被阅读0次

    原文地址:https://wetest.qq.com/lab/view/352.html

    第一点:android是基于Looper消息循环的系统
    第二点:MessageQueue 中的IdleHandler接口

        /**
         * Callback interface for discovering when a thread is going to block
         * waiting for more messages.
         */
        public static interface IdleHandler {
            /**
             * Called when the message queue has run out of messages and will now
             * wait for more.  Return true to keep your idle handler active, false
             * to have it removed.  This may be called if there are still messages
             * pending in the queue, but they are all scheduled to be dispatched
             * after the current time.
             */
            boolean queueIdle();
        }
    

    简而言之,就是在looper里面的message暂时处理完了,这个时候会回调这个接口,返回false,那么就会移除它,返回true就会在下次message处理完了的时候继续回调,
    第三点: measure, layout, draw 这些view的绘制都类似于一个message 当所有的message 执行完毕
    会暂时回调一次IdleHandler
    第四点:处理问题1 当返回的数据处理逻辑特别复杂 耗时的情况下 可以把 数据处理放到IdleHandler 中
    这样不会因为数据的复杂 影响view 的绘制
    写法:

     Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
                @Override
                public boolean queueIdle() {
                    /*dosometing*/
                    return false;
                }
            });
    

    第五点:处理问题 多次快速处理数据 只需要最后一次的结果(适用场景 单线程 + 异步)

          btn_test.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    threadHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 0; i < 5; i++){
                                try {
                                    Thread.sleep(1000);
                                    Log.d("ccccccc","第" + k + "个任务--》" + i + "");
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                            k++;
                        }
                    });
                }
            });
    
            handlerThread = new HandlerThread("test_thread");
            handlerThread.start();
            threadHandler = new Handler(handlerThread.getLooper());
    
            MessageQueue messageQueue = handlerThread.getLooper().getQueue();
            messageQueue.addIdleHandler(new MessageQueue.IdleHandler() {
                @Override
                public boolean queueIdle() {
                 
                    return true;
                }
            });
    

    多次post任务 当所有任务执行完毕 会回调对用的IdleHandler 返回true 会多次触发 如果返回false 则只会执行一次

    相关文章

      网友评论

        本文标题:你知道android的MessageQueue.IdleHand

        本文链接:https://www.haomeiwen.com/subject/vugedqtx.html