转来三篇文章:第一篇是罗升阳写的,我是看完他的书这一章,发现他只讲了源码部分,没往应用方面展开,所以上网搜补充的知识。所以后面两篇是补充知识,包括
(1)View.post
(2)Handler怎么关联线程的looper
(3)每个自定义Thread要怎么掉用Looper类的成员函数,如prepare(),loop()。
Android应用程序消息处理机制(Looper、Handler)分析
http://blog.csdn.net/luoshengyang/article/details/6817933
Android UI线程和非UI线程
http://www.cnblogs.com/mengdd/p/3418780.html
Do not access the Android UI toolkit from outside the UI thread.
从非UI线程访问UI组件会导致未定义和不能预料的行为。
为了解决这个问题,Android提供了一些方法,从其他线程访问UI线程:
比如,上面这段代码可以这么改:
public void onClick(View v) {
new Thread(new Runnable() {
public void run() {
final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png");
mImageView.post(new Runnable() {
public void run() {
mImageView.setImageBitmap(bitmap);
}
});
}
}).start();
}
要和UI线程连接,实例化Handler的时候应该使用Handler(Looper)
这个构造方法。
这个构造方法使用了一个 Looper
对象,这是Android系统中线程管理的framework的另一个部分。
当你用一个特定的 Looper
实例来创建一个 Handler时,这个 Handler就运行在这个 Looper
的线程中。
Android的消息循环机制 Looper Handler类分析
http://www.cnblogs.com/mengdd/p/3601294.html
线程在默认情况下是没有消息循环与之关联的,Thread类在run()方法中的内容执行完之后就退出了,即线程做完自己的工作之后就结束了,没有循环的概念。
调用Looper类的 prepare()
方法可以为当前线程创建一个消息循环,调用loop()
方法使之处理信息,直到循环结束。
大多数和消息循环的交互是通过 Handler
类进行的。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}