我有scheduleAtFixedRate的问题。 它只会调用一次而不会重复。怎么了?
public class TimerService extends Service {
static final int UPDATE_INTERVAL=3000;
private Timer timer = new Timer();
private Date date;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
repeatJob();
//Here we want this service to continue running until it is explicitly stopped, so return sticky
return START_STICKY;
}
private void repeatJob() {
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Looper.prepare();
date = new Date();
displayToast(date.toString());
Log.d("repeat", new Date().toString());
Looper.loop();
}
}, 0, UPDATE_INTERVAL);
}
private void displayToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_LONG).show();
}
}
我在片段活动中调用服务:
getActivity().startService(new Intent(getActivity().getApplicationContext(), TimerService.class));
如何从服务到片段活动获取日期的当前值(以及将来可能更多的值)?
谢谢!
答案 0 :(得分:1)
你在这里做了很多奇怪的事情,我不确定究竟是什么导致了这个问题,但我会告诉你这是怎么做到的:
您应该使用AlarmManager
来安排服务重复执行,并摆脱Timer。 Timer仅在您的进程处于活动状态时才有效,而AlarmManager将记住待处理的意图,即使您的应用程序的进程未运行(在这种情况下它将启动它)。它还具有更高的内存和电池效率,因为它是一个集中式系统,可以管理所有应用程序的编程任务,而不仅仅是您自己的应用程序。
服务不应该重新安排自己,只需完成它需要做的任务。请注意它们在主线程中运行,因此您需要创建一个工作线程。考虑使用IntentService
因为它已经完成了这一点。要将结果传回活动,您的服务可以向包含附加内容中的数据的活动发送意图。您还可以广播结果并在活动中的广播接收器中处理它,或者您也可以绑定到服务并注册回调。
删除Looper
行,删除计时器后不需要此行。
最后,您似乎对START_STICKY
标志的作用感到有些困惑。它不会使服务“在显式停止之前继续运行”。无法保证服务在Android中无限期运行。这个标志的作用是告诉系统,如果它缺少内存并且它杀死了服务,一旦它恢复它应该尝试重新创建服务,但是没有重新发布待处理的意图。更多信息here。
答案 1 :(得分:0)
确定。我刚刚面临同样的问题而且奇怪的是当我删除Looper.prepare
& Looper.loop
,它实际上以给定的间隔时间执行但是执行不成功bcoz它说它需要Looper.loop
到目前为止,我不能删除它,因为它需要,但当它在那里它使任务执行一次..加上我没有Android专家。
如果你对此有任何更新,请告诉我。