我有一个IntentService,它使用TimerTask每45秒在OnHandleIntent中调用webservice。
我的问题是: 我正在调用app启动IntentService,而在OnHandleIntent中,任务由于TimerTask而不断重复。这是一个很好的做法,或者这有什么缺点吗?我是否应该在我的活动中使用警报管理器每隔一段时间调用意图服务或罚款以继续使用计时器任务在OnHandleIntent中重复任务?
我的代码是这样的:
@Override
protected void onHandleIntent(Intent intent)
{
context=this; //INTENT CONTEXT
final int timerValue = Integer.parseInt(MainActivitySharedPref.GetValue(context, "serviceTimer"));
Log.d(TAG, "DOWNLOADSERVICE called having MainActivity.callService as: " + MainActivity.callService);
t = new Timer();
task = new TimerTask()
{
public void run() {
//run tasks
};
t.scheduleAtFixedRate(task, 0, timerValue); // service executes task every 45 seconds
谢谢。
答案 0 :(得分:2)
在IntentService中的OnHandleIntent中使用TimerTask是一个好习惯吗?
绝对不是。
IntentService
旨在允许您通过onHandleIntent()
在提供的后台主题中执行工作。它不是为你设计的,它可以分叉线程,注册监听器,设置TimerTask
/ ScheduledExecutorService
,或者做任何可能在onHandleIntent()
结束之后运行的事情。一旦IntentService
结束,onHandleIntent()
将自行关闭,之后Android可能会在几秒钟内终止您的进程,之后您的后台线程(或者,在这种情况下,TimerTask
)可以完成其工作。
请使用常规Service
。
我应该在我的活动中使用警报管理器每隔一段时间调用意图服务还是罚款以继续使用计时器任务在OnHandleIntent中重复任务?
如果你只是在你的某些活动在前台时这样做,那么每45秒部分就可以了。如果您尝试在电池供电的设备上连续执行此操作,请准备好让用户对您造成的电池耗电进行攻击。
但是,虽然您的活动位于前台... ScheduledExecutorService
(TimerTask
的现代替代品)在常规Service
中应该没问题。您不应该需要AlarmManager
,这是专门设计为在您的流程终止后为您提供控制权,延长轮询期。