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上验证通过)