zoukankan      html  css  js  c++  java
  • 实际用Handler的体会

    1.关于构造Message对象

    Message 可以通过 new Message(),也可以通过handler.obtainMessage()。两种的区别,后者无需在内存中重新开辟空间,而是直接从消息队列池中取出。

    /**
         * Returns a new {@link android.os.Message Message} from the global message pool. More efficient than
         * creating and allocating new instances. The retrieved message has its handler set to this instance (Message.target == this).
         *  If you don't want that facility, just call Message.obtain() instead.
         */
        public final Message obtainMessage()
        {
            return Message.obtain(this);
        }

    从from the global message pool中可以看出。


    2.实际开发中什么情况下用到了handler.

    需求:在搜索结果页只有一个ListView,当用户输入的关键词为空的时候,从SharePreference中取出10个历史词,当用户每输入一个关键词,都会触发获取联想词的异步任务。当用户点击搜索按钮后,当前listview显示搜索结果。历史词、联想词、搜索结果共用一个ListView。分别使用adapterHistory,adapterAssociation,adapterSearch.

    问题:在使用TextWatcher监听EditText中关键词变化的过程中,如果用户快速把搜索框中的关键词删掉的过程中,这个过程中会触发联想词的异步任务。当用户删完关键词,ListView显示出了历史词,但是由于联想词的异步任务相比本地拿SharePreference的速度要慢,容易导致当前listview显示的结果是联想词的adapter。

    解决办法:在执行不同类型任务之前,执行如下代码

    if(handler.hasMessages(1)){
                            handler.removeMessages(1);
                        }
                        Message msg = handler.obtainMessage();
                        msg.what = 2;
                        handler.sendMessage(msg);
    如果消息队列中有另一个任务的消息,先把它清空。


    3.在联想词触发的过程中,如果可以通过sendMessageDelayed()方法延迟触发。

    if (handler.hasMessages(1)) {
                            handler.removeMessages(1);
                        }
                        Message msg = handler.obtainMessage();
                        msg.what = 1;
                        msg.obj = key;
                        handler.sendMessageDelayed(msg, 300);




  • 相关阅读:
    读入优化
    poj 3216 Repairing Company
    poj 2594 Treasure Exploration
    poj 1419 Graph Coloring
    POJ 3308 Paratroopers(最小点权覆盖)(对数乘转加)
    bzoj2007: [Noi2010]海拔
    bzoj4552: [Tjoi2016&Heoi2016]排序
    bzoj1041: [HAOI2008]圆上的整点
    oracle 的服务器进程(PMON, SMON,CKPT,DBWn,LGWR,ARCn)
    undo表空间居高不下和enq: US
  • 原文地址:https://www.cnblogs.com/ameryzhu/p/6555619.html
Copyright © 2011-2022 走看看