一、单线程模型

当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。

在开发Android 应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。

如果在非UI线程中直接操作UI线程,会抛出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views,这与普通的java程序不同。

由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序。

如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,因此android采用一种复杂的Message Queue机制保证线程间通信。

Message Queue:

Message Queue是一个消息队列,用来存放通过Handler发布的消息。Android在第一次启动程序时会默认会为UI thread创建一个关联的消息队列,可以通过Looper.myQueue()得到当前线程的消息队列,用来管理程序的一些上层组件,activities,broadcast receivers 等等。你可以在自己的子线程中创建Handler与UI thread通讯。

通过Handler你可以发布或者处理一个消息或者是一个Runnable的实例。每个Handler都会与唯一的一个线程以及该线程的消息队列管理。

Looper扮演着一个Handler和消息队列之间通讯桥梁的角色。程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleMessage进行处理。

(以上转自http://www.cnblogs.com/nio-nio/archive/2012/07/23/2604900.html)

二、多线程的实现

有以下几种方式:

1)Activity.runOnUiThread(Runnable)

2)View.post(Runnable) ;View.postDelay(Runnable , long)

3)Handler

4)AsyncTask

Android是单线程模型,这意味着Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,所以你单纯的new一个Thread并且start()是不行的,因为这违背了Android的单线程模型。那么如何用好多线程呢?总结一下:  
事件处理的原则:所有可能耗时的操作都放到其他线程去处理。

对于第一种方法:

activity.runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
int i = 30;
textView.setText(""+i+" s");
}
}
});

第2,3种方法网络上资料较多,不再赘述。第4种方法在上一篇博文中已经介绍。

三、总结:

1)android系统是单线程系统,为了实现多线程的效果,采用了message queue。

2)为实现多线程,可采用runOnUiThread,post,handle,AsyncTask技术实现。

最新文章

  1. js获取键盘按下的键值event.keyCode,event.charCode,event.which的兼容性
  2. 数字和为sum的方法数
  3. Leetcode--Merge Two Sorted Lists
  4. DATASNAP 自增长字段问题
  5. XML转义特殊字符
  6. 关于 typings install 的使用
  7. UILabel 的使用,属性详解
  8. Android adb端口转发调试助手Packet Sender
  9. nmon命令用法
  10. 201521123098 JAVA课程设计
  11. 【转】awk用法介绍
  12. 「ZJOI Day2」游记
  13. Building real-time dashboard applications with Apache Flink, Elasticsearch, and Kibana
  14. RAID的基本介绍
  15. scala笔记之惰性赋值(lazy)
  16. 好汉两个半第一季/全集Two And A Half Men迅雷下载
  17. CentOS编译安装vim
  18. create a bootable USB stick on Ubuntu
  19. DropDownList切换选择,服务器控件Repeater未更新
  20. 18年10月31日 NOIP模拟赛

热门文章

  1. shell 脚本浅入
  2. java精度计算代码,指定精确小数位
  3. Myeclipese改变背景色
  4. 读书笔记 effective c++ Item3 在任何可能的时候使用 const
  5. FZU 2167 大王叫我来巡山呐
  6. request和response对象的具体介绍
  7. Debug和Release区别
  8. JavaScript 基本类型值-Undefined、Null、Boolean
  9. webstorm 编辑器破解 (麻麻再也不用担心过期了)
  10. 从源码解析LinkedList集合