【问题标题】:Firebase Job DispatcherFirebase 作业调度程序
【发布时间】:2017-10-03 08:41:15
【问题描述】:

我正在创建一个需要向 API 发送请求的应用程序。该请求必须每 2 分钟发送一次。为此,我使用 Firebase Job Dispatcher

问题是第一个请求是按时发送的,但下一个请求的发送延迟更大:例如。

  • 第一个请求:2 分钟后发送
  • 第二个请求:2.3 分钟后发送(而不是两分钟)
  • 第三个请求:3.5 分钟后发送(而不是两个)
  • 第四次请求:5 分钟后发送(而不是两分钟)

你可以想象,一天之后,延迟会是30分钟甚至更多……

这是我用来创建作业的代码(在主要活动中 - onCreate)

        Job pingJob = mDispatcher.newJobBuilder()
            .setService(PingJob.class) // the job class to execute
            .setTag(PingJob.TAG) //tag - name of the job
            .setRecurring(true) // repeat
            .setTrigger(Trigger.executionWindow(60, 60*2))
            .setReplaceCurrent(false)
            .build();

    mDispatcher.mustSchedule(pingJob);

这是 PingJob 类(为了确保问题不是我在 onStartJob 中所做的,我只放了一个日志):

public class PingJob extends Job {
    public static final String TAG = "ping_job";

    @Override
    public boolean onStartJob(final JobParameters params) {
        Log.d("ping job", "just put a log to see when is executed");
        jobFinished(params, true);
        return true;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

}

我正在使用带有 Android 6.0.1 的 Android 机器(但我的应用程序也必须在 4.3 设备上运行,这就是为什么我使用 firebase 而不是 JobScheduler)和 Google Play 服务 11.5.09 (434)。

您知道为什么要这样做吗?如果有办法解决这个问题?如果没有,是否有其他方法可以每 2 分钟完成一次工作?

【问题讨论】:

    标签: android firebase-job-dispatcher


    【解决方案1】:

    你没有做错任何事。这是设计的预期行为。 FirebaseJobDispatcher 在 Google Play 服务中使用调度引擎,它可能在 Android 5.0 及更高版本的后台使用JobScheduler。 JobScheduler 将来自不同应用程序的任务批处理到一个批处理中,以免过于频繁地唤醒设备并节省电池。因此,不能保证您的任务将每 2 分钟准确执行一次。如果您需要这种精度,请考虑使用 AlarmManager,不建议您进行任何网络调用,因为它会影响电池寿命。

    为什么您甚至需要如此频繁地发送请求?考虑更多地考虑你在做什么。将发送到后端的数据保存在数据库或磁盘中可能会更好。然后,您可以每 30-60 分钟或任何适合您的方式分批发送。您还可以使用Firebase Cloud Messaging 向设备发送消息,要求其在需要时将数据发送到后端。

    【讨论】:

    • 首先感谢您的回答。这是一个数字标牌应用程序,因此我需要每两分钟发送一次此请求,因为我们需要知道该应用程序是否仍在运行/连接,以便在客户呼叫我们时减轻支持。
    • 然后试试 AlarmManager 和 IntentService。不完美,但如果你不太关心电池,应该可以很好地适应你的情况。
    • 好吧,我试试,电池没问题,它是一个一直插着电源的盒子。非常感谢
    • 如何将您的评论标记为解决方案?还是将您的答案标记为解决方案更好?
    • @dev 我的回答已经包含有关 AlarmManager 的信息。因此,如果它对您有用,那么我认为答案本身应该被标记为解决方案。
    猜你喜欢
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2019-11-24
    • 2017-02-17
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多