在线程里面不断进行网络请求,并在服务销毁时销毁线程

xiaoxiao2021-02-28  117

问题描述:想在后台服务里面进行网络请求,但需要每隔一段时间就向服务器请求一次(实际上是一个伪推送),有两种实现方式

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时间之内调用。也就是子线程会睡一会,醒一会,睡一会,醒一会,要在子线程睡着的时候调用。

转载请注明原文地址: https://www.6miu.com/read-49303.html

最新回复(0)