博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android开发之多线程实现方法概述
阅读量:5887 次
发布时间:2019-06-19

本文共 1846 字,大约阅读时间需要 6 分钟。

一、单线程模型

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/wangicter/archive/2013/06/05/4767229.html

你可能感兴趣的文章
mysql入门笔记1
查看>>
VM虚拟机添加硬盘
查看>>
常用单位解析、换算、线速转发
查看>>
Ex2010-09 Create a new Certificate
查看>>
vim命令学习总结
查看>>
线性表--单链表(C++)
查看>>
mysql 5.7.9 免安装版本
查看>>
【基础技术】Java基础那些事儿系列-成员变量与局部变量
查看>>
0726linux基础内容小记
查看>>
【加密工具】2019年网络安全加密工具排行,好用的计算机加密软件推荐
查看>>
练习题
查看>>
mysql中Timestamp,time,datetime 区别
查看>>
使用Python快速建立FTP服务器
查看>>
Python和Cython有什么关系?
查看>>
bind安装域名解析服务,以及分离服务
查看>>
Netfilter/Iptables Layer7 应用层过滤策略部署
查看>>
12.21 php-fpm的pool 12.22 php-fpm慢执行日志 12.23 open_b
查看>>
如何挂载另一个lvm硬盘
查看>>
安装cobbler
查看>>
第3章 方法的重载及参数传递
查看>>