How to schedule an android service to execute at a fixed rate

纵然是瞬间 提交于 2019-12-08 07:29:22

问题


I am working on an application that should download a file from the network every X seconds to check for any change, I use a service to do that, but its execution is not fixed with the delay time rate, here is my code for the service:


@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    checkUpdate();
    return START_STICKY;
}

private Void checkUpdate() {
    timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                Log.i("Service", String.valueOf(++counter));
                if(Helper.isNetworkAvailable(getBaseContext())) {
                      // download file
                } else {
                        Log.e("ServiceHandler", "Couldn't get any data from the url");
                    }
                }else {
                    Log.e("Connection", "No connection");
                }
            }
        }, 10000, 10000);
    return null;
}

The output isn't fixed, it is supposed to run every 10 seconds, while running the service run in a random manner


回答1:


How about setting up an AlarmManager within an IntentService? Much more accurate.

 Intent intent = new Intent(context, YourClass.class);
 PendingIntent pi = PendingIntent.getService(context, 0, intent, 0);
 AlarmManager am = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE);
 am.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 10*1000, pi);

Make sure within YourClass.class (which is an IntentService), put your logic in the handleIntent(Intent intent), which will be called every 10 seconds by the PendingIntent sent by the AlarmManager.

P.S. Update your manifest

Hope it helps




回答2:


Instead of Timer Class, use AlarmManager class. It also performs the same repeating tasks you want. AlamrManager is light weight and it runs even if your device is in sleep mode.

Also see this link Android: How to repeat a service with AlarmManager




回答3:


For repetitive jobs android provides simple api, called Timer please look it. Very simple to use.




回答4:


Try this :

@Override
      public void onStart(Intent intent, int startId) {

          StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
          StrictMode.setThreadPolicy(policy);

            Log.d("Internet Available:  ", ""+flag);

            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.SECOND, 10);

            Intent intent1 = new Intent(this, UpdateWidgetServiceDemo.class);

            PendingIntent pintent = PendingIntent.getService(this, 0, intent1, 0);

            AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
            int i;
            i=15;

            alarm.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pintent);


        super.onStart(intent, startId);
      }

REMOVE return START_STICKY;



来源:https://stackoverflow.com/questions/20948755/how-to-schedule-an-android-service-to-execute-at-a-fixed-rate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!