为了账号安全,请及时绑定邮箱和手机立即绑定

在Android中调度循环任务

在Android中调度循环任务

慕运维8079593 2019-07-09 10:12:05
在Android中调度循环任务我正在设计一个应用程序,它有一个经常性的任务,即只要应用程序处于前台,就会将其发送到专用服务器。在我的网上搜索中,我看到了几种不同的方法,并且想知道什么是最好的方法。调度服务器调用的最佳方法是什么?我看到的选择是:定时器.ScheduledThreadPoolExecutor.服务.广播电台AlarmManager.你的意见呢?编辑: 我之所以需要这个,是因为一个基于聊天的应用程序,它将所有的用户操作发送到远程服务器。即用户正在输入消息,用户正在读取消息,用户处于联机状态,用户处于脱机状态等。这意味着每隔一段时间,我就需要发送服务器我正在做的事情,因为我和其他人打开了一个聊天室,他们需要知道我在做什么。类似于WhatsApp消息反馈机制:编辑2: 现在,应该几乎总是通过JobSchedulerAPI(或FirebaseJobDispatcher),以防止电池耗尽问题,如生命体征部分安卓训练
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我不确定,但据我所知,我同意我的看法。如果我错了,我总是接受最好的答案。

报警经理

警报管理器保持CPU唤醒锁,只要警报接收器的锁onReceive()方法正在执行。这保证了在你处理完广播后手机不会睡觉。一次onReceive()返回时,警报管理器将释放此唤醒锁。这意味着,在某些情况下,电话会在您的onReceive()方法完成。如果你的报警器呼叫Context.startService(),在所请求的服务启动之前,手机可能会休眠。为了防止这件事,你的BroadcastReceiverService将需要实现单独的唤醒锁定策略,以确保电话继续运行直到服务可用为止。

注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前没有运行。对于正常的定时操作(滴答、超时等),使用Handler更容易,效率更高。

定时器

timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        synchronized public void run() {

            \\ here your todo;
            }

        }}, TimeUnit.MINUTES.toMillis(1), TimeUnit.MINUTES.toMillis(1));

Timer有一些缺点可以通过ScheduledThreadPoolExecutor..所以这不是最好的选择

ScheduledThreadPoolExecutor.

你可以用java.util.TimerScheduledThreadPoolExecutor(首选)在后台线程上定期安排动作。

下面是一个使用后者的示例:

ScheduledExecutorService scheduler =
    Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate      (new Runnable() {
         public void run() {
            // call service
         }
      }, 0, 10, TimeUnit.MINUTES);

所以我更喜欢ScheduledExecutorService

但是也要考虑到,如果在应用程序运行时将发生更新,则可以使用Timer,如其他答案或较新的答案所示ScheduledThreadPoolExecutor..如果应用程序在未运行时仍将进行更新,则应使用AlarmManager.

警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前没有运行。

请注意,如果您计划在关闭应用程序时进行更新,则每十分钟更新一次是非常频繁的,因此可能会太耗电。


查看完整回答
反对 回复 2019-07-09
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

定时器

正如在javadocs最好使用ScheduledThreadPoolExecutor。

ScheduledThreadPoolExecutor

当用例需要多个工作线程且睡眠间隔较小时,请使用此类。有多小?嗯,我想大概15分钟。这个AlarmManager此时启动调度间隔,这似乎表明,对于较小的睡眠间隔,可以使用该类。我没有数据支持最后一项声明。这是一种预感。

服务

VM可以随时关闭您的服务。不要将服务用于经常性任务。循环任务可以启动一项服务,这完全是另一回事。

AlarmManager的BroadCastReciever

对于更长的睡眠间隔(>15分钟),这是方法。AlarmManager已经有常量(AlarmManager.INTERVAL_DAY)暗示它可以在最初计划的几天后触发任务。它还可以唤醒CPU来运行代码。

您应该根据您的计时和工作线程需要使用这些解决方案之一。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 523 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信