android应用是单线程模式的。
单线程模式需要记住两条:
一、防止UI线程阻塞
二、确保只在UI线程中访问Android UI工具包
在开发Android应用时必须遵守单线程模型的原则:Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。
在此介绍下何谓UI线程:当一个程序第一次启动时,Android会同时启动一个对应的主线程(Main Thread),主线程主要负
责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件
进行处理。所以主线程通常又被叫做UI线程。
什么情况下会出现线程阻塞?如在登录时,一般会去访问网络,这个需要一段时间,如果写带UI线程中,则会出现界面假死
现象,也就是界面卡住不支持用户交互,这一点在要求高交互的手机上肯定是不能容许的。ok,这个时候你可能会去考虑新
开一个线程或者在后台线程中来执行耗时的操作,如下面的例子:
public void onClick( View v ) {
new Thread( new Runnable() {
public void run() {
Bitmap b = loadImageFromNetwork(); //从网络上下载图片
mImageView.setImageBitmap( b ); //把图片设置给ImageView
}
}).start()
}
上面的代码会报错,你可能会说逻辑很正确啊,但是它违背了Android单线程模型:Android UI操作并不是线程安全的并且
这些操作必须在UI线程中执行。
Andriod提供了几种在其他线程中访问UI线程的方法:
Activity.runOnUiThread( Runnable )
View.post( Runnable )
View.postDelayed( Runnable, long )
Hanlder
下面引人android的异步处理机制:Handler和AsyncTask。其中AsyncTask比hander更轻量级一些。在Android1.5中
提供了AsyncTask。它使创建需要与用户界面交互的长时间运行的任务变得更简单。
•线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统
•另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
•Params 启动任务执行的输入参数,比如HTTP请求的URL。
•Progress 后台任务执行的百分比。
•Result 后台执行任务最终返回的结果,比如String。