开启周期性的线程操作

在开发过程中,碰到这么一种需求,需要在后台开启一个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即可。

 

 

 

你可能感兴趣的:(线程)