res/color/text_color_selector.xml
Looper中的消息队列处理机制
Looper也提供了消息的定义、消息的发送、消息的处理者的自定义和消息队列。在其头文件Looper.h中,定义了消息结构体Message,它只有一个类型成员,Message的定义如下(见文件Looper.h,下同):
消息的处理者可由MessageHandler进行处理:
使用者可通过派生出子类来扩展消息。对消息的处理,需要在MessageHandler的子类中重载handleMessage函数。
它们将被封装到消息“信封”MessageEnvolope中,然后送到消息队列中。MessageEnvolope的定义如下:
Looper中维护着一个自己的消息队列:
可以使用Looper的sendMessageAtTime(另外两个版本也最终都使用的是sendMessageAtTime)向消息队列中发送消息:
消息发送函数将根据实参,将它们打包到消息信封中,然后放置到消息队列中。最后,若消息队列中原先没有消息(即在接收方睡眠等待),则让wake函数写入字符到管道写端唤醒接收方在pollInner中epoll_wait上的睡眠等待,让其开始对消息接收处理。pollInner对消息队列的处理的代码片段如下:
当醒来后,在上面的行275若检查到消息队列不为空,则检查队列上的第一项是不是超时了。若超时了,则取下它,调用消息信封中指定的MessageHandler的handleMessage函数去处理消息(行294)。
因此,借助于Looper的sendMessageXXX函数和pollOnce函数,可以向Looper内部的消息队列发送消息,这时pollOnce的调用者将被唤醒去处理消息,当消息处理完毕和没有消息时,将会睡眠等待。
本文节选自《深入剖析Android系统》一书
杨长刚 著
电子工业出版社出版
2012-08-17 10:22:22.848 text_viewchange[879:f803] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "MainViewController" nib but the view outlet was not set.'
*** First throw call stack:
(0x13bb052 0x154cd0a 0x1363a78 0x13639e9 0xd7f0d 0xd83a9 0xd85cb 0x38a73 0x38ce2 0x38ea8 0x3fd9a 0x1f7f 0x109d6 0x118a6 0x20743 0x211f8 0x14aa9 0x12a5fa9 0x138f1c5 0x12f4022 0x12f290a 0x12f1db4 0x12f1ccb 0x112a7 0x12a9b 0x1c92 0x1c05)
terminate called throwing an exceptionCurrent language: auto; currently objective-c
(gdb)
由于把别的控件的UIView的referencing outlet 下的new refecening outlet 与file‘s owner中的Viev 删掉了。只要重新关联就行了。。