问题
i have an IntentService that calls webservice in OnHandleIntent every 45 seconds using TimerTask.
my question is: i am calling on app start the IntentService, and in OnHandleIntent the task keeps repeating due to TimerTask..is it a good practice to do this or does this have any drawbacks? should i use an alarm manager in my activity to call the intent service every amount of time or its fine to keep on repeaing the task in OnHandleIntent using the timer task?
my code is like this:
@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
Thank you.
回答1:
Is it a good practice to use TimerTask in OnHandleIntent in IntentService?
Absolutely not.
IntentService
is designed to allow you to perform work in a supplied background thread via onHandleIntent()
. It is not designed for you to fork threads, register listeners, set up TimerTask
/ScheduledExecutorService
, or do anything else that would be running past the end of onHandleIntent()
. The IntentService
will shut itself down once onHandleIntent()
ends, after which Android may terminate your process within seconds, before your background threads (or, in this case, TimerTask
) can do its work.
Please use a regular Service
.
should i use an alarm manager in my activity to call the intent service every amount of time or its fine to keep on repeaing the task in OnHandleIntent using the timer task?
If you are doing this only while some activity of yours is in the foreground, the every-45-seconds part is OK. If you are trying to do this continuously, on battery-powered devices, be prepared to be attacked by users for the battery drain that you are causing.
But, while an activity of yours is in the foreground... ScheduledExecutorService
(the modern replacement for TimerTask
) in a regular Service
should be fine. You should not need AlarmManager
, which is specifically designed to give you control after your process has been terminated, for longer polling periods.
来源:https://stackoverflow.com/questions/30216423/is-it-a-good-practice-to-use-timertask-in-onhandleintent-in-intentservice