现在的位置: 首页 > 综合 > 正文

Handler的一些零碎知识点

2012年06月01日 ⁄ 综合 ⁄ 共 1457字 ⁄ 字号 评论关闭

1. 关于Android  Handler的问题

  今天看了别人写的技术博客,有这么一句话,Handler中包含了两个队列,一个是线程队列,一个是消息队列。使用post方法会将线程对象添加到线程队列中,使用sendMessage方法会将消息发送到消息队列中去。

  我认为这句话是有问题的,Handler中只有一个队列,这个队列MessageQueue是由ArrayList实现的,而这个队列中也只会存储Message这么一种类型的对象(欠妥,需要验证??)通过post发动的Runnable对象,会经过一层包装,将Runnable对象其包装成一个Message,看代码:

public final boolean post(Runnable r)
    {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }

private final Message getPostMessage(Runnable r) {
       Message m = Message.obtain();
       m.callback = r;
       return m;
   }

那么在Looper进行轮询的时候,又是怎么去执行这种线程队象的呢?

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

Handler: private final void handleCallback(Message message) {
        message.callback.run();
    }

如果Message对象中有mCallback属性不为空的话,就去执行mCallback中的run方法,而没有开启新的线程。这也验证了下面的这句话。

 

2. 使用Handler的post方法将Runnable对象放到Handler的线程队列中后,该Runnable的执行其实并未单独开启线程,而是仍然在当前Activity线程中执行的,Handler只是调用了Runnable对象的run方法

 

3.getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,那么使用getWritableDatabase() 方法就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

 

4. 界面中存在MultiAutoCompleteTextView,如何不让他获得光标(焦点),在xml配置中,添加 android:focusable="false"即可,对于EditText也一样使用。(已在HTC hero上验证通过)

抱歉!评论已关闭.