当前位置: 首页 > 知识库问答 >
问题:

在IntentService的OnHandleContent中使用TimerTask是一种好的做法吗?

齐承运
2023-03-14

我有一个IntentService,它使用TimerTask每隔45秒在OnHandleContent中调用webservice。

我的问题是:我正在调用应用程序启动IntentService,而在OnHandleIntent中,由于TimerTask,任务不断重复。。这样做是一种好做法还是有任何缺点?我应该在我的活动中使用报警管理器每次调用intent service,还是继续使用timer任务在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

非常感谢。

共有1个答案

姜钊
2023-03-14

在IntentService的OnHandleContent中使用TimerTask是一种好的做法吗?

绝对不是。

IntentService旨在允许您通过onHandleIntent()在提供的后台线程中执行工作。它不是为您设计的,用于分叉线程、注册侦听器、设置TimerTask/ScheduledExecutorService,或者执行任何将在OnHandleContent()结束后运行的操作。IntentService将在onHandleIntent()结束后自动关闭,在此之后,Android可能会在几秒钟内,在后台线程(或者在本例中,TimerTask)开始工作之前,终止您的进程。

请使用常规的服务

我应该在我的活动中使用报警管理器每次调用intent service,还是继续使用timer任务在OnHandleIntent中重复任务?

如果你只是在你的某些活动处于前景时才这样做,那么每隔45秒的部分就可以了。如果你试图在电池供电的设备上持续这样做,请准备好因你造成的电池耗电而受到用户的攻击。

但是,当你的一项活动处于前景时ScheduledExecutorService(TimerTask的现代替代品)在常规服务中应该可以。您不需要AlarmManager,它是专门为在进程终止后让您控制更长的轮询周期而设计的。

 类似资料:
  • 我有一个枚举: 在枚举成员之间使用方法检查“层次结构”有什么问题吗?我的意思是-当有人将来可能会意外更改顺序时,使用它排除冗长是否有任何缺点。 还是这样做更好:

  • 我见过很多次scala代码使用Option(对于简单值)或[List[Error],T]来处理错误。 这为这样的代码提供了位置 这会产生一个不太好的代码嵌套,迫使您处理每一步的失败,并迫使您让所有函数返回一个[...] 所以我想知道 > 在scala(或一般的函数式编程)中不鼓励使用异常 使用它们有任何缺点(关于不可变性或代码并发性) 异常与原理或函数式编程有些冲突 你可以想出一个更好的方法来编写

  • 这在本质上不像那样工作吗?使用它甚至是好的实践吗?这让我很不安。

  • 问题内容: 我已经多次听到在HTML 中使用JavaScript事件(例如)是不正确的做法,因为它不利于语义。我想知道不利之处以及如何解决以下代码? 问题答案: 您可能正在谈论简洁的Javascript,看起来像这样: 中央javascript文件中的逻辑如下所示: 优点是 行为(JavaScript)与表示(HTML)分开 没有语言的混合 您正在使用像jQuery这样的javascript框架,

  • 问题内容: 我已经多次听到在HTML 中使用JavaScript事件(例如)是不正确的做法,因为它不利于语义。我想知道不利之处以及如何解决以下代码? 问题答案: 您可能正在谈论简洁的Javascript,看起来像这样: 中央javascript文件中的逻辑如下所示: 优点是 行为(JavaScript)与表示(HTML)分开 没有语言的混合 您正在使用像jQuery这样的javascript框架,

  • 问题内容: 如果使用Sun的专有Java类,则编译器将显示警告。我认为使用这些类通常不是一个好主意。我在某处阅读过。但是,除了警告之外,还有其他根本原因不建议您使用它们? 问题答案: 因为它们是内部API,所以它们可能会以未记录或不受支持的方式进行更改,并且已绑定到特定的JRE / JDK(在您的情况下为Sun),从而限制了程序的可移植性。 尽量避免使用此类API,请始终偏爱公开记录和指定的类。