开启周期性的线程操作
在开发过程中,碰到这么一种需求,需要在后台开启一个service服务,每隔一个小时请求一次网络数据,并更新桌面的widget组件。
可行的方法有两种:
1,借助于定时器。在service的oncreate方法中
timer=new Timer(); timer.schedule(new TimerTask(){ @Override public void run() { //因为service是在后台运行,并不存在ui阻塞的问题,因此可以不另开一个线程去请求网络信息 place = getSharedPreferences("SP", Activity.MODE_PRIVATE) .getString("name", "xcgy"); try { new SendRequest().getLevelInfo(Constant.LevelInfoURL + place, levelInfoSp, Constant.LevelKey); // 发送广播通知appwidget进行更新 Intent intent = new Intent("wyf.action.aqi_upadte"); RefService.this.sendBroadcast(intent); Thread.sleep(3600000); } catch (Exception e) { e.printStackTrace(); } } }, 0, 3600000);
然后在service的ondistory方法中将定时器关闭。
timer.cancle();
2,借助线程休眠和标志位
初始化的时候将flag设置为true。在service的oncreate方法中:
while (flag) { //因为service是在后台运行,并不存在ui阻塞的问题,因此可以不另开一个线程去请求网络信息 place = getSharedPreferences("SP", Activity.MODE_PRIVATE) .getString("name", "xcgy"); try { new SendRequest().getLevelInfo(Constant.LevelInfoURL + place, levelInfoSp, Constant.LevelKey); // 发送广播通知appwidget进行更新 Intent intent = new Intent("wyf.action.aqi_upadte"); RefService.this.sendBroadcast(intent); Thread.sleep(3600000); } catch (Exception e) { e.printStackTrace(); } }
在service的ondistory方法中只需要将标志位设置为false即可。