android中的进程与线程的理解
一个android应用就是一个Linux进程,每个应用在各自的进程中运行,互不干扰,比较安全。
一个应用对应一个主线程,就是通常所说的UI线程,android遵守的就是单线程模型,所以说Ui操作不是线程安全的。CalledFromWrongThreadException通常就是在非主线程中刷新UI引起的。
在单线程的模型下,一些耗时的操作就要交给其它子线程去执行。于是就有了Message Queue(消息队列),辅助线程间进行通信。每个线程都可以有自己的Message Queue,特别的是主线程中的消息对列是系统生成的,每个MessageQueue都会有一个对应的handler,其它子线程中要想有自己的消息队列必须手动生成。管理消息队列的是Looper,每个进程都有自己的Looper。子线程中Message Queue 的生成必须依赖于Looper,Looper一旦开始loop后,它就会一直监控着消息队列,对send进来的Message进行处理。先进先出。一旦处理完一条Message,那么该Message马上就会被置为null。当传送过来很多的消息时,不知道交给哪个线程执行时,可以判断当前这个传送消息过来的handler里面的Looper对象是属于哪个线程的,属于哪个线程就在哪个线程里执行。
1,一个Handler可以通过它的构造函数来个它设置looper.
Handler handler = new Handler(getMainLooper());
2,在子线程中handler通过sendMessage将消息传到拥有当前Handler对象的那个线程中,利用hadlerMessage来处里。
www.zzzyk.com
Handler handerHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
case 1:
break;
}
super.handleMessage(msg);
}
};
3,Handler向MessageQueue发送消息除了sendMessage之外还有post也可以,它发的是一个unnable会自动执行。
handler.post(new Runnable()
{
@Override
public void run()
{
}
});
4,在子线程中创建自己的消息队列,并监控次消息队列。
Class A implements Runnable{
Handelr handler;
public void run() {
Looper.prepare();
handler = new Handler(){
public void handleMessage(Message msg) {
}
}
Looper.loop();
}
}
在java.util.concurrent 框架中给我们提供了另外一个工具AsyncTask,它的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦(匿名线程开销大,如果每个任务都要创建一个线程,那效率就上不来了。匿名线程难以管理)。
摘自 yuxlong2010的专栏
补充:移动开发 , Android ,