猿问

在Android中调度循环任务

在Android中调度循环任务

我正在设计一个应用程序,它有一个经常性的任务,即只要应用程序处于前台,就会将其发送到专用服务器。

在我的网上搜索中,我看到了几种不同的方法,并且想知道什么是最好的方法。

调度服务器调用的最佳方法是什么?

我看到的选择是:

  1. 定时器.

  2. ScheduledThreadPoolExecutor.

  3. 服务.

  4. 广播电台AlarmManager.

你的意见呢?

编辑: 
我之所以需要这个,是因为一个基于聊天的应用程序,它将所有的用户操作发送到远程服务器。
即用户正在输入消息,用户正在读取消息,用户处于联机状态,用户处于脱机状态等。

这意味着每隔一段时间,我就需要发送服务器我正在做的事情,因为我和其他人打开了一个聊天室,他们需要知道我在做什么。

类似于WhatsApp消息反馈机制:

编辑2: 
现在,应该几乎总是通过JobSchedulerAPI(或FirebaseJobDispatcher),以防止电池耗尽问题,如生命体征部分安卓训练


慕运维8079593
浏览 524回答 3
3回答

幕布斯6054654

我不确定,但据我所知,我同意我的看法。如果我错了,我总是接受最好的答案。报警经理警报管理器保持CPU唤醒锁,只要警报接收器的锁onReceive()方法正在执行。这保证了在你处理完广播后手机不会睡觉。一次onReceive()返回时,警报管理器将释放此唤醒锁。这意味着,在某些情况下,电话会在您的onReceive()方法完成。如果你的报警器呼叫Context.startService(),在所请求的服务启动之前,手机可能会休眠。为了防止这件事,你的BroadcastReceiver和Service将需要实现单独的唤醒锁定策略,以确保电话继续运行直到服务可用为止。注意:警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前没有运行。对于正常的定时操作(滴答、超时等),使用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.Timer或ScheduledThreadPoolExecutor(首选)在后台线程上定期安排动作。下面是一个使用后者的示例:ScheduledExecutorService scheduler =     Executors.newSingleThreadScheduledExecutor();scheduler.scheduleAtFixedRate      (new Runnable() {          public void run() {             // call service          }       }, 0, 10, TimeUnit.MINUTES);所以我更喜欢ScheduledExecutorService但是也要考虑到,如果在应用程序运行时将发生更新,则可以使用Timer,如其他答案或较新的答案所示ScheduledThreadPoolExecutor..如果应用程序在未运行时仍将进行更新,则应使用AlarmManager.警报管理器适用于您希望在特定时间运行应用程序代码的情况,即使您的应用程序当前没有运行。请注意,如果您计划在关闭应用程序时进行更新,则每十分钟更新一次是非常频繁的,因此可能会太耗电。

慕姐8265434

定时器正如在javadocs最好使用ScheduledThreadPoolExecutor。ScheduledThreadPoolExecutor当用例需要多个工作线程且睡眠间隔较小时,请使用此类。有多小?嗯,我想大概15分钟。这个AlarmManager此时启动调度间隔,这似乎表明,对于较小的睡眠间隔,可以使用该类。我没有数据支持最后一项声明。这是一种预感。服务VM可以随时关闭您的服务。不要将服务用于经常性任务。循环任务可以启动一项服务,这完全是另一回事。AlarmManager的BroadCastReciever对于更长的睡眠间隔(>15分钟),这是方法。AlarmManager已经有常量(AlarmManager.INTERVAL_DAY)暗示它可以在最初计划的几天后触发任务。它还可以唤醒CPU来运行代码。您应该根据您的计时和工作线程需要使用这些解决方案之一。
随时随地看视频慕课网APP

相关分类

Android
我要回答