原文地址: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 则只会执行一次

更多相关文章

  1. android导出sqllist数据库要先配置adb.exe加到环境变量里
  2. Android:ListView数据异步加载、Handler、AsyncTask
  3. Android ListView组合CheckBox实现多选获取数据
  4. Android开发学习——android与服务器端数据交互
  5. android sqlite3 数据库升级,加字段
  6. android 读取json数据(遍历JSONObject和JSONArray
  7. Android listView FastScroll 快速查询数据
  8. 柱状图以及饼图进行数据统计
  9. android 升级数据库 修改表结构

随机推荐

  1. Android应用程序版本号管理(官方文档中文
  2. Android资源访问
  3. Android下使用lamemp3库将PCM录音数据压
  4. Android之如果解决Android(安卓)studio项
  5. ListView中显示圆形图像
  6. android Input系统事件分发流程
  7. Android回部古剑之ViewFlipper之仙人指路
  8. Android开发 ADB配置调试命令图解
  9. Android原理揭秘系列之View、ViewGroup
  10. WebView 使用Android(安卓)原生ToolBar