使用HandlerThread实现后台服务轮询执行任务
2016-01-12 09:22
756 查看
需求:后台服务轮询执行网络请求,并将返回结果更新数据库
轮询实现方案:
方案一: Service + Timer + Thread
实现思路:使用timer定时执行TimerTask
缺点:如果有异步任务,下次任务开始执行时需要判断上次任务是否完成,从而导致任务间隔时间不可控。
方案二: Service + HandlerThread
实现思路:在HandleMessage方法中执行任务,任务结束后向MessageQueue中添加延时消息
优点:如果有异步任务,只需在异步任务执行完毕后再向MessageQueue中添加延时消息,任务间隔时间可控
结论:使用方案二实现轮询更适合。
关键代码实现:
BackgroundService.java
补充:
Android官方推荐使用IntentService来替代Service实现后台服务。分析IntentService源码可以看出,其内部实现与方案二类似。需要注意的是IntentService在handleMessage方法最后会调用stopSelf方法来停止服务,所以要想实现服务不停止,需要设置msg.what不等于-1。
轮询实现方案:
方案一: Service + Timer + Thread
实现思路:使用timer定时执行TimerTask
缺点:如果有异步任务,下次任务开始执行时需要判断上次任务是否完成,从而导致任务间隔时间不可控。
方案二: Service + HandlerThread
实现思路:在HandleMessage方法中执行任务,任务结束后向MessageQueue中添加延时消息
优点:如果有异步任务,只需在异步任务执行完毕后再向MessageQueue中添加延时消息,任务间隔时间可控
结论:使用方案二实现轮询更适合。
关键代码实现:
BackgroundService.java
@Override public IBinder onBind(Intent intent) { HandlerThread handlerThread = new HandlerThread("BackgroundService"); handlerThread.start(); handler = new Handler(handlerThread.getLooper()){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //模拟耗时任务 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } //向MessageQueue中添加延时消息,5s后重复执行以上任务 handler.sendEmptyMessageDelayed(MSG_GET_COMPARE_RESULT,5000); } }; return new GetCompareResultBinder(); }
补充:
Android官方推荐使用IntentService来替代Service实现后台服务。分析IntentService源码可以看出,其内部实现与方案二类似。需要注意的是IntentService在handleMessage方法最后会调用stopSelf方法来停止服务,所以要想实现服务不停止,需要设置msg.what不等于-1。
相关文章推荐
- java-模拟tomcat服务器
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件