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

来源:互联网 发布:远程一对一上课软件 编辑:程序博客网 时间:2024/05/29 12:56

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

1.参考《第一行代码》中定时执行的后台服务,开启定时器,缺点是每次都会开启一个新的线程,比较占内存,于是想了第二种方法

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

0 0
原创粉丝点击