一、单线程模型

当一个程序第一次启动时,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技术实现。

android开发之多线程实现方法概述相关推荐

  1. android设计一个多线程和画图的程序小球,Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能实例...

    本文实例讲述了Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能的方法.分享给大家供大家参考,具体如下: 1.布局界面 xmlns:tools="http://sc ...

  2. Android开发之多线程编程Thread和Runnable使用

    Android开发之多线程编程Thread和Runnable使用 Android可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:前者只要继承了Thread类同时覆写了 ...

  3. Android开发--初识多线程/线程的创建,开启,休眠,中断

    在Android开发中有一项非常重要的技术---多线程,本文针对线程的创建,开启,休眠和中断做介绍. 如同在JAVA开发中一样,在Android中,提供了两种方法创建线程,一种是通过Thread类的构 ...

  4. 【Android开发】三种方法实现Button点击事件响应

    目录 1.在xml中对onclick()进行指定方法 2.NEW一个OnClickListenner()接口实现 3.实现OnClickListener接口(Switch方法) Hello,你好呀,我 ...

  5. 一些提高Android开发效率的工具方法

    一些提高开发效率的工具&方法 1. 使用快捷键提高操作效率 下面的有些快捷键是经过我修改的,如果你不知道AS原生的快捷键是什么或者忘记了快捷键可以到Settings->Keymap下面搜 ...

  6. android开发realm多线程操作,数据库的设计:深入理解 Realm 的多线程处理机制

    你已经阅读过 Realm 关于线程的基础知识.你已经知道了在处理多线程的时候你不需要关心太多东西了,因为强大的 Realm 会帮你处理好这些,但是你还是很想知道更多细节-- 你想知道在 Realm 的 ...

  7. android开发实例-标准意图方法Intent(二)

    Intent.ACTION_CALL与Intent.ACTION_DIAL之细微差别:     前面说到Action和URI描述语句的组合运用,其中有两个,作用相同,只是代码略有不同 URI描述语句  ...

  8. Android方法的概括,Android_Android中startService基本使用方法概述,Android中有两种主要方式使用Ser - phpStudy...

    Android中startService基本使用方法概述 Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindServi ...

  9. Android开发:图文分析 Handler通信机制 的工作原理

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 下面,将图文详解 Handler机制 的工作原理 目录 1. 定义 一套 Android 消息传递机制 2. 作用 在多线程的 ...

最新文章

  1. bash shell的一些基本概念
  2. RxSwift ViewModel定义
  3. 哪里不知道“瞄”哪里,这项AI黑科技,打开手机就能体验
  4. Tips/Tricks#0:母版页中对控件ID的处理
  5. electron 主进程与渲染进程 渲染进程与渲染进程 之间的通信
  6. Linux的使用和认识实验,通过一个小实验认识Linux vDSO
  7. linux 物理内存用完了_12张图解Linux内存管理,程序员内功修炼,看过都说懂了!...
  8. python二维数据读取对齐_python代码要严格对齐
  9. MFC将bmp图像设为背景
  10. poj 2594 Treasure Exploration 匈牙利二分匹配+floyd
  11. 【声源定位】基于matlab广义互相关声源定位【含Matlab源码 548期】
  12. 【Gym-101889 D】Daunting device【分块】
  13. 非线性规划求解器 Lingo, Matlab 使用心得,及使用的求解算法
  14. matlab根据数值大小聚类,[matlab聚类分析]请教高手:用matlab做聚类分析,节点数多于30个怎么画聚类图啊?...
  15. windows-sys4:win10 预览体验计划不能选择版本渠道
  16. ida “ failed to load pdb info. 不支持此接口” “DIA: No such interface supported”问题
  17. java毕业设计时装购物系统mybatis+源码+调试部署+系统+数据库+lw
  18. 第四天(打造离线下载服务器)
  19. java抛硬币,抛硬币模拟(Coin Tossing Simulation)
  20. 产品经理进阶(一)Web APP UI一致性设计

热门文章

  1. 07_支持向量机1_统计学习方法
  2. 没有流氓软件,只有流氓行为
  3. 原生js调用json方法
  4. 使用vSphere Power Cli初始化数据中心
  5. NO.47 确定项目要完成的需求列表
  6. Tomcat 基于域名的虚拟主机设置
  7. shell tr命令
  8. C++基本数据类型列表
  9. Tomcat修改源码,重新编译
  10. 15.Numpy之点乘、算术运算、切片、遍历和下标取值