一、单线程模型

当一个程序第一次启动时,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是单线程模型,这意味着AndroidUI操作并不是线程安全的并且这些操作必须在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. Android(安卓)Handler的详细介绍
  2. android 消息垂直滚动轮播控件
  3. Android多文件断点续传(一)——数据封装以及界面实现
  4. Android--Handler的使用方法:在子线程中更新界面
  5. Android(安卓)API : SMS短信服务处理
  6. Android(安卓)Handler解析
  7. 面试经典题Handler机制回答
  8. Android-使用HttpURLConnection实现多线程下载
  9. AsyncTask 完全解析

随机推荐

  1. Android实现底部半透明弹出框PopUpWindow
  2. Mac OS下配置 ADB环境变量
  3. 屏幕锁知识点
  4. Android网易有道词典案例源码分享
  5. Android --- MediaPlayer的使用详解
  6. android的自动更新
  7. Android中的SQLiteOpenHelper类
  8. android按钮事件触发拨号器
  9. Android(安卓)ARouter路由中传对象遇到的
  10. Android退出时关闭所有Activity的方法