android 线程,服务,活动
来源:互联网 发布:典狱司歌词含义知乎 编辑:程序博客网 时间:2024/04/29 19:33
Android用的是J2SE,因此在其中的线程就是Java的线程。但是Android有自己的一套框架,因此线程的使用有一些新的东西。
活动与服务
在Android中,程序可以分成好几个组件,其中最重要的两个就是活动(Activity)和服务(Service)。活动是用户的GUI,而服务则运行于后台。比如说,一个IM,活动就是聊天的界面,而服务则用于网络通讯。
如果仅仅是这样的话,那么服务不过是一个没有界面的活动而已。但是实际上并非如此。为了节约资源,当一个活动不可见的时候,它是不会执行任何代码的,这时候就要靠服务了。例如在播放音乐的时候,就必须要用到服务,不然一切换到别的软件音乐就停了。
因此服务就给程序提供了后台运行的可能。更进一步的,服务是可以远程调用的,不只这个程序可以调用它,其他程序也可以调用它(前提是有相应的接口和权限)。
但是有一点要注意的是,同一个进程中的服务和活动是在同一线程中的。换句话说,后台和GUI是会相互阻塞的。这个和我的直觉有点出入,因为既然是后台服务嘛,怎么会阻塞到前台界面呢,但是事实就是如此。因此要在服务中执行长时间的操作(如网络应用)时,还是要自己创建线程来操作。
Looper
和HandlerThread
Android在Java的线程上又加了一层,使得线程拥有了消息队列(Message Queue)的支持。提供此支持的就是Looper
。一个Looper
负责执行一个消息循环,当消息队列里有消息时,处理消息,否则保持休眠。通常的GUI框架都会有消息循环与分发的概念,Android通过Looper将这个概念引入到了Java的线程中。通过它,只需要很少的代码就能为Java的线程加入这个功能:
class
LooperThread
extends
Thread {
public
Handler mHandler;
public
void
run() {
Looper.prepare();
mHandler =
new
Handler() {
public
void
handleMessage(Message msg) {
// 在此处理新消息
}
};
Looper.loop();
}
}
其中重载Handler的handleMessage()
方法来处理消息。
Android提供了HandlerThread
类,这个类本身就是一个支持消息循环的线程类。
注意要启动一个线程还是需要手动调用start()
的。
Handler
Handler
是用于操作线程的消息队列的类。可以用空参数创建它,这样它就自动绑定到创建它的线程的消息队列上。也可以为它提供一个Looper
,这样它就会绑定到Looper
所在的线程上。Handler
为不同线程之间的通信提供了方便。要和另外一个线程通信,只要得到它的Handler就行了。
对于上面的示例代码,mHandler
就是绑定到新创建线程的Handler
(因为run()
是在新的线程中运行的)。对于一个HandlerThread
,可以用getLooper()
来得到它的Looper
,但是要注意必须在这之前用start()
启动了线程,不然是Looper
是空的(文档上没说明这点,囧了我好一阵子)。
Handler的最大好处在于,它不只可以发送消息,还可以用post()
来发送一个Runnable
。这样一来,就可以在指定进程里面执行Runnable
的run()
方法中的代码了,也就是跨线程方法调用:)
另外,通过将Handler绑定到自己所在的线程,然后用post()
方法,可以使一段Runnable里的代码不是立刻执行,而是在线程的消息队列轮到post过去的Runnable时才执行。不过我不明白这有什么用,还请高人指点。
Handler
还可以指定消息/Runnable被处理的时间,这就可以把它当成定时器了(不过精确度不会太高吧)。
runOnUiThread()
当一个线程有结果了,要通知GUI更新呢?可以用Context
的getMainLooper()
来得到主线程,然后用Handler
操作。但是Activity
类提供了一个简单的方法:runOnUiThread()
。于是我们可以在线程中调用要更新的Activity的某个更新方法,在那个方法里用runOnUiThread()
,将要运行的代码封装在一个Runnable里喂给它就行了。
- android 线程,服务,活动
- Android活动与服务之间的通信
- Android进程、线程、任务、活动栈
- Android之服务(二)活动和服务进行通信
- Android- 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收器(BroadcastReceiver)
- Android- 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收器(BroadcastReceiver)
- Android- 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收器(BroadcastReceiver)
- Android- 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收器(BroadcastReceiver)
- Android Service——活动和服务进行通信
- Android之Service(三):活动和服务进行通信
- android中活动、服务之间传值简单总结笔记
- 服务与活动
- Android活动
- android活动
- Android--活动
- android 活动与服务进行通讯(服务(Service)一)
- Android 系列 4.11使用活动线程队列和处理程序在线程之间发送消息
- android开机启动无界面服务线程
- 苦战两天以后的成果,SQL ,Executesql,带输入及输出传参的
- Cygwin for Geomview 的安装和配置
- linux 双网卡在同一网段的解决办法
- 耶鲁大学开放课程:博弈论
- 数据结构-双链表
- android 线程,服务,活动
- 软件管道规则
- Nokia论坛filelogger中不能直接使用的原因
- 祝福!
- asp.net 页面清除缓存
- android 的sqlite 主键与simpleCursorAdapter
- KongfuPandaGameEngine编写日记--2010年7月31日18点33分
- 分页与非分页内存
- 惊讶