一个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来处里。

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(){

publicvoidhandleMessage(Messagemsg){

}

}

Looper.loop();

}

}

java.util.concurrent 框架中给我们提供了另外一个工具AsyncTask,它的特点是任务在主线程之外运行,而回调方法是在主线程中执行,这就有效地避免了使用Handler带来的麻烦(匿名线程开销大,如果每个任务都要创建一个线程,那效率就上不来了。匿名线程难以管理)。

更多相关文章

  1. android多线程机制
  2. Android的schedule、AlarmService、Timer定时器机制
  3. Android(安卓)init进程启动过程分析
  4. android消息处理——Thread、Looper、Handler
  5. Android(安卓)View 绘制刷新流程分析
  6. 【Android】AsyncTask源码分析
  7. Android(安卓)Handler之从主线程往子线程发消息(一)
  8. Android(安卓)的Handler、Looper和MessageQueue的关系和实现原理
  9. android面试题(一)

随机推荐

  1. android 基于树结构的任意层级列表
  2. Android中Gif图片的显示
  3. Android安全模式
  4. java与android之间的安全通讯
  5. 让Android程序获得系统的权限,实现关机重
  6. C:Android camera S:PC opencV阶段总结
  7. 随便聊聊android的源码
  8. Android与Js相互调用基础篇
  9. Android(安卓)帧(frame)动画
  10. 关于Android 如何实现mobile data on/off