问题描述:想在后台服务里面进行网络请求,但需要每隔一段时间就向服务器请求一次(实际上是一个伪推送),有两种实现方式
1.参考《第一行代码》中定时执行的后台服务,开启定时器,缺点是每次都会开启一个新的线程,比较占内存,于是想了第二种方法
@Override public int onStartCommand(Intent intent, int flags, int startId) { new Thread(new Runnable() { @Override public void run() { //while (flag) { if (new NetStatus(getApplicationContext()).isNetworkAvailable()) { //new MyNetConnection("http://www.douban.com").myGet(); //new MyNetConnection("http://192.168.1.118:8080/OMC/sendOrder.do").myGet(); //new MyNetConnection("http://192.168.1.110:8080/OMC/test.do").myGet(); //new MyNetConnection("http://192.168.1.110:8080/OMC/sendOrder.do").myGet(); //new MyNetConnection("http://192.168.1.118:8080/OMC/sendOrder.do", "OK").myPost(); //new MyNetConnection("http://192.168.2.113:8080/TestCC/aa").myGet(); //new MyNetConnection("http://192.168.0.110:8080/OMC/sendOrder.do", "yes").myPost(); //new MyNetConnection("http://123.206.8.19:8080/OMC/sendOrder.do", "yes").myPost(); new MyNetConnection("http://123.206.8.19:8080/OMC/sendOrder.do", "yes").myGet(); Log.d(TAG, "AAAAAAAAAAAAAAA" + Thread.currentThread().getName()); try { Log.d(TAG, "sleep......"); Thread.sleep(15 * 1000);//线程睡15s之后再进行网络请求 Log.d(TAG, "awake......"); } catch (InterruptedException e) { e.printStackTrace(); } } //} } }).start(); //定时器,每隔15秒执行一次 AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); int anHour = 15 * 1000; long triggerAtTime = SystemClock.elapsedRealtime() + anHour; Intent i = new Intent(this, AlarmReceiver.class); PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, 0); manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi); return super.onStartCommand(intent, flags, startId); }
2.在run方法里面用while死循环
new Thread(new Runnable() { @Override public void run() { while (flag) { if (new NetStatus(getApplicationContext()).isNetworkAvailable()) { //new MyNetConnection("http://www.douban.com").myGet(); //new MyNetConnection("http://192.168.1.118:8080/OMC/sendOrder.do").myGet(); //new MyNetConnection("http://192.168.1.110:8080/OMC/test.do").myGet(); //new MyNetConnection("http://192.168.1.110:8080/OMC/sendOrder.do").myGet(); //new MyNetConnection("http://192.168.1.118:8080/OMC/sendOrder.do", "OK").myPost(); //new MyNetConnection("http://192.168.2.113:8080/TestCC/aa").myGet(); //new MyNetConnection("http://192.168.0.110:8080/OMC/sendOrder.do", "yes").myPost(); //new MyNetConnection("http://123.206.8.19:8080/OMC/sendOrder.do", "yes").myPost(); new MyNetConnection("http://123.206.8.19:8080/OMC/sendOrder.do", "yes").myGet(); Log.d(TAG, "AAAAAAAAAAAAAAA" + Thread.currentThread().getName()); try { Log.d(TAG, "sleep......"); Thread.sleep(15 * 1000);//线程睡15s之后再进行网络请求 Log.d(TAG, "awake......"); } catch (InterruptedException e) { e.printStackTrace(); } } } } }).start();
ps.开始用这个方法时,while里面用的是true,一直执行。但发现当活动或服务销毁时,这个线程还在执行,于是就像上图一样设置一个标志位flag,当服务或活动销毁是,将flag置false。
参考了:线程像这样:Thread{ boolean flag = fase; run(){ while(!flag){ } }}Thread t = new Thread();t.start();-----------------------------------------------------要终止循环,只需要这样t.flag=true;================================================还有一种方式 线程像这样:Thread{ run(){ while(true){ Thread.sleep(xxxx); } }}Thread t = new Thread();t.start();--------------------------------------------要终止循环,只需要这样t.interrupte();但是这里要注意调用的时机,要在子线程执行了run方法里面的sleep(xxxx)后xxxx时间之内调用。也就是子线程会睡一会,醒一会,睡一会,醒一会,要在子线程睡着的时候调用。