Android开发之IntentService和HandlerThread分析
2015-11-13 16:52
513 查看
Android开发之IntentService和HandlerThread分析
近期有一个项目需要用到Service,Service默认情况下是在UI主线程运行的;因此为了防止出现停止响应对话框,防止界面卡住,需要在Service中启动异步线程来进行任务处理;
有一个很方便的封装好的对象就是IntentService;源码如下:
先看几个定义的变量:
由上可以看出,IntentService的onCreate方法中运行了一个HandlerThread ,然后根据该任务的Looper实例化了一个Handler,也就是获取了一个异步任务的消息压入器和消息处理器。
然后我们再看看onStart
最后看看onHandleIntent方法:
源码中还有设置Service重新启动方式的部分,这里就不做展示;
从以上可以看出,IntentService就是在Service中启动了一个异步任务来实现Service中的业务处理;
下面我们在看看HandlerThread:
首先:
是继承自Thread的;
再看看run:
HandlerThread的业务十分简单,就是在一个异步任务中新建自己的异步任务队列。
从以上的分析不难看出,只要将项目业务中的需求合理的分开,然后分别实现,最后在将各个部分组合起来,那么就会形成一个运行稳定,功能够用的系统;
近期有一个项目需要用到Service,Service默认情况下是在UI主线程运行的;因此为了防止出现停止响应对话框,防止界面卡住,需要在Service中启动异步线程来进行任务处理;
有一个很方便的封装好的对象就是IntentService;源码如下:
先看几个定义的变量:
private volatile Looper mServiceLooper; private volatile ServiceHandler mServiceHandler; private String mName; private boolean mRedelivery; private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } @Override public void handleMessage(Message msg) { //处理Intent onHandleIntent((Intent)msg.obj); //结束该任务 stopSelf(msg.arg1); } }
onCreat方法: @Override public void onCreate() { super.onCreate(); //new一个HandlerThread HandlerThread thread = new HandlerThread("IntentService[" + mName + "]"); thread.start(); //保存下来Looper对象 mServiceLooper = thread.getLooper(); //初始化一个Handler对象 mServiceHandler = new ServiceHandler(mServiceLooper); }
由上可以看出,IntentService的onCreate方法中运行了一个HandlerThread ,然后根据该任务的Looper实例化了一个Handler,也就是获取了一个异步任务的消息压入器和消息处理器。
然后我们再看看onStart
@Override public void onStart(Intent intent, int startId) { //获取消息,压入消息队列 Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; mServiceHandler.sendMessage(msg); }
最后看看onHandleIntent方法:
我们需要重写该方法来实现自己的业务需求 @WorkerThread protected abstract void onHandleIntent(Intent intent);
源码中还有设置Service重新启动方式的部分,这里就不做展示;
从以上可以看出,IntentService就是在Service中启动了一个异步任务来实现Service中的业务处理;
下面我们在看看HandlerThread:
首先:
public class HandlerThread extends Thread {
是继承自Thread的;
再看看run:
@Override public void run() { //可以看出,run中首先初始化一个Looper,然后得到该Looper的引用,最后执行Looper中的消息;使Looper运行起来。 mTid = Process.myTid(); Looper.prepare(); synchronized (this) { mLooper = Looper.myLooper(); notifyAll(); } Process.setThreadPriority(mPriority); onLooperPrepared(); Looper.loop(); mTid = -1; }
HandlerThread的业务十分简单,就是在一个异步任务中新建自己的异步任务队列。
从以上的分析不难看出,只要将项目业务中的需求合理的分开,然后分别实现,最后在将各个部分组合起来,那么就会形成一个运行稳定,功能够用的系统;
相关文章推荐
- <android5.0>之CircularReveal
- Android 项目工程优化
- 为ListView子视图添加动画
- Android中的dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()
- android中的AIDL进程间通信
- listView的原理和优化总结
- Android开发中,有哪些让你觉得相见恨晚的方法、类或接口?
- Android SimpleAdapter 的详解和使用
- 【Android学习笔记】Android进程间通信方式Messenger
- Android Studio美化之优雅的logcat
- android 代码规范
- Android Studio美化之优雅的logcat
- android studio 使用大全
- 让Android Studio格式化也能自动换行
- Android命名规范
- Android 分裂的多面性
- Android开发的技术层次
- Android setResult()的调用时机
- android studio Cause:failed to find target with hash string 'android - 17' in...
- Android ViewPager使用详解