首页 > 程序开发 > 移动开发 > Android >

android中的进程与线程的理解

2011-12-06

一个android应用就是一个Linux进程,每个应用在各自的进程中运行,互不干扰,比较安全。一个应用对应一个主线程,就是通常所说的UI线程,android遵守的就是单线程模型,所以说Ui操作不是线程安全的。CalledFromW...

一个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.2cto.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的专栏

相关文章
最新文章
热点推荐