我正在开发一个应用程序,应该每隔X秒从网络下载一个文件以检查是否有任何更改,我使用服务来执行此操作,但其执行并未通过延迟时间率修复,这是我的代码服务:
@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;
}
输出不固定,应该每隔10秒运行一次,同时以随机方式运行服务
答案 0 :(得分:2)
如何在IntentService中设置AlarmManager?更加准确。
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);
确保在YourClass.class(这是一个IntentService)中,将你的逻辑放在handleIntent(Intent intent)中,它将由AlarmManager发送的PendingIntent每10秒调用一次。
P.S。更新您的清单
希望有所帮助
答案 1 :(得分:0)
使用AlarmManager类代替Timer Class。它还执行您想要的相同重复任务。 AlamrManager重量轻,即使您的设备处于睡眠模式,它也会运行。
另请参阅此链接Android:How to repeat a service with AlarmManager
答案 2 :(得分:0)
对于重复性工作,android提供了简单的api,称为Timer请查看。使用起来非常简单。
答案 3 :(得分:0)
试试这个:
@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);
}
删除return START_STICKY;