在介绍ApiDemo中的Service示例之前有必要对Android的线程做个说明。
在Application启动后,Android系统会为这个应用创建一主线程(Main Thread),主线程负责把消息分发给相应的UI控件,并处理屏幕绘制事件,因此主线程也被称为UI 线程,事件的处理是通过一个称为“Event Queue”来分发的。比如,按下屏幕上某个按钮后,UI 线程将会把“Touch”事件通知该按钮,按钮接受到这个“Touch”事件将其状态设为“按下”状态,并向Event Queue中添加一个“Invalidate”事件表示该按钮需要重绘。 UI线程会定时从Event
Queue取出请求事件并通知按钮重绘。
当应用启动后,缺省情况下只有一个Main Thread在运行,如果应用设计得不好的话,这种单线程模型可能会导致应用程序性能很差。特别是如果所有的操作都发生在这个UI线程中,比如一些费时的操作如网络操作,数据库访问将会阻塞UI线程,造成应用程序不响应用户输入,严重的情况Android将显示ANR (应用程序无响应)对应框,强制应用程序退出。
所以设计一个及时响应用户的应用的一个基本原则是:永远不要阻塞UI线程,如果你有一些费时的操作,启动一个工作线程(worker thread)来完成。
使用工作线程时如果需要更新UI ,需要注意的是,目前大部分系统UI 都是设计成单线程模式的,也就是说UI 组件定义的操作不是”Thread -Safe”的,不能直接在非UI线程(如工作线程)中更新UI。幸运的是Android系统提供多种类或方法来实现从非UI线程中更新UI:
-
Activity.runOnUiThread(Runnable)
-
View.post(Runnable)
-
View.postDelayed(Runnable, long)
-
Handler
-
AsyncTask
这里稍微详细介绍一下Handler 其它几种都比较好理解。 可以参见Android简明开发教程十九:线程
Bezier曲线。
Android 在每个创建的Thread都可以有个与之关联的Message Queue,如果在这个Thread中创建Handler 对象,这个Handler 对象可以用来向创建它的Thread的Message Queue发送消息。比如在Main Thread(UI Thread)创建的Handler 可以用来个UI线程发送消息。
Handler 定义两类操作:
-
一是定义在未来的某个时刻执行某个操作(Runnables) ,这主要是通过调用post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long) 来完成。
-
二是在别的Thread的Event Queue添加一个操作,以便在该Thread中执行,这主要通过调用sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long)来完成。
我们再来看看AdvancedPreferences 中与Handler相关的代码:
private Handler mHandler = new Handler();
mHandler 定义在 AdvancedPreferences ,AdvancedPreferences 为PreferenceActivity的子类 (UI组件), mHandler 因此与UI Thread 的Message Queue关联,可以用来给UI线程发送消息或是Schedule 一个Runnable 以便在 UI 线程中执行。
private Runnable mForceCheckBoxRunnable = new Runnable() {
public void run() {
if (mCheckBoxPreference != null) {
mCheckBoxPreference.setChecked(!mCheckBoxPreference.isChecked());
}
// Force toggle again in a second
mHandler.postDelayed(this, 1000);
}
};
上面代码定义了一个Runnable 对象,其中代码mHandler.postDelayed(this, 1000); 给UI线程Message Queue发送一个请求:每隔1秒钟执行自己,切换mCheckBoxPreference的状态并再次请求1秒执行同样操作。 UI 线程 定时从Message Queue中取出事件来执行 (更新 Checkbox 在UI线程中),这样就实现了从非UI线程中执行UI更新操作。
分享到:
相关推荐
Android的Handler使用方法总结,不错的文档,跟大家分享分享
* 创建一个Handler对象,使用Handler对象h把Runnable的对象r压入队列 * 此时只会会执行Run()方法,但是不会开启新的线程 */ //Handler h = new Handler(); //h.post(r); /* * 在java中真正开启...
Android Handler传值的,简单的介绍了Handler的用法
android的多线程消息处理机制核心成员handler,基本用法很简单,相关资料也很多。本例子给大家带来handler的奇葩用法,与大家一起分享。
作为android开发重要的一部分。handler起到了十分重要的作用。就像布局文件一样。这个很重要。文档中由于时间关系后期排版不是很好。希望读者见谅。
在Android开发中,我们经常会遇到这样一种情况:在UI界面上进行某项操作后要执行一段很耗时的代码,比如我们在界面上点击了一个”下载“按钮,那么我们需要执行网络请求,这是一个耗时操作,因为不知道什么时候才能...
android:handler简单用法
主要介绍了android的handler使用方法,大家参考使用吧
NULL 博文链接:https://txlong-onz.iteye.com/blog/826617
用android的handler机制作了一个刷新画面的小例子。
Android Handler使用方法,Button事件响应处理,Activity切换
Handler在android里负责发送和处理消息。它的主要用途有(或者是干什么的): 1)执行计划任务,按计划(定时)发送消息或执行某个Runnanble(使用POST方法); 2)线程间通信,把从其他线程中发送来的消息放入消息...
NULL 博文链接:https://txlong-onz.iteye.com/blog/934957
主要介绍了Android定时器和Handler用法,实例分析了Android中的定时器与Handler相关使用技巧,非常具有实用价值,需要的朋友可以参考下
一个简单的小例子,用来学习android Handler和ProgressBar的用法
整理了Handler的各种使用方法
开发环境为android4.1.Handler使用例1这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会继续启动该...
1.简介之前讲了关于Handler的原理,这篇要讲一讲关于Handler的使用方法。2. Handler的初始化通过下面的代码可知,当msg.what 中的数值