IntentService是如何在子线程运行的。
来源:互联网 发布:mac新建文本文档 编辑:程序博客网 时间:2024/06/06 18:00
IntentService 是如何让服务运行在子线程的
IntentService是一个继承Service的抽象类。
public abstract class IntentService extends Service { private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; ..... } private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { onHandleIntent((Intent)msg.obj); stopSelf(msg.arg1); } } @Override public void onCreate() { // TODO: It would be nice to have an option to hold a partial wakelock // during processing, and to have a static startService(Context, Intent) // method that would launch the service & hand off a wakelock. super.onCreate(); //开启一个工作线程 HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); //工作线程 thread对象在run方法中创建,所以调用thread.start()后,本线程的looper对象和消息队列就创建完成了 mServiceLooper = thread.getLooper(); //handled对象关联thread线程中的looper对象 和 消息队列。 mServiceHandler = new ServiceHandler(mServiceLooper); } ````` @Override public void onStart(Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }
//服务运行时,handle封装Message对象。加入到
对应的消息队列中,looper对象就会去遍历消息队列
取出Message对象,并调用器msg.target.dispatchMessage(msg);
looper是在运行在子线程中的,所以handler处理消息也是在子线程。这样就实现了把任务添加到工作线程中执行。
阅读全文
0 0
- IntentService是如何在子线程运行的。
- 广播和服务之重点: 长期运行的服务: 在子线程工作的本地服务实现————IntentService
- 如何让NSURLConnection在子线程中运行
- 多线程-5、如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- iOS多线程的初步研究(五)-- 如何让NSURLConnection在子线程中运行
- 如何正确的终止正在运行的子线程
- 如何正确的终止正在运行的子线程
- 如何正确的终止正在运行的子线程
- 如何正确的终止正在运行的子线程
- hibernate之cretiria,hql,本地sql基本使用
- 1 Tow Sum
- 测试Maxscript中对材质进行序列命名
- android6.0 动态申请权限
- Google Android Developer
- IntentService是如何在子线程运行的。
- 可展开的TextView
- leetcode 238. Product of Array Except Self
- linux如何修改文件或目录的权限(chmod)
- ELK学习8_ELK数据流传输过程_问题总结1
- TCP 连接和状态说明
- Vector详细介绍(源码解析)和使用示例
- 数据结构---二叉树的创建、先序、中序、后序遍历
- oneinstack 的php.in在哪