【问题标题】:Android - Firebase jobdispatcherAndroid - Firebase 作业调度程序
【发布时间】:2017-06-18 18:36:30
【问题描述】:

我想知道是否可以使用 Firebase jobdispatcher 来安排 url 命中并获取响应以更新数据库。 我希望它每天晚上运行一次。有谁知道这是否可能?

我找不到任何这样做的好例子。我已经阅读了 android 文档和 https://github.com/firebase/firebase-jobdispatcher-android#user-content-firebase-jobdispatcher-

我需要使用 Firebase jobdispatcher,因为我的目标是 API 16。

提前致谢。

更新

这是我每天安排一次的。

final int periodicity = (int) TimeUnit.HOURS.toSeconds(24);
final int toleranceInterval = (int) TimeUnit.HOURS.toSeconds(1);

FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
Job job = dispatcher.newJobBuilder()
        .setService(UpdateTVJobService.class)
        .setTag(JOB_TAG)
        .setTrigger(Trigger.executionWindow(periodicity, periodicity + toleranceInterval))
        .setLifetime(Lifetime.FOREVER)
        .setRecurring(true)
        .setReplaceCurrent(true)
        .build();

int result = dispatcher.schedule(job);

if (result != FirebaseJobDispatcher.SCHEDULE_RESULT_SUCCESS) {
    Log.d("JOB_TAG", "ERROR ON SCHEDULE");
}

【问题讨论】:

    标签: android firebase android-service firebase-job-dispatcher


    【解决方案1】:

    您可以使用 Firebase JobDispatcher 安排重复作业。根据您的要求,您需要创建一个扩展 JobService 的服务,该服务从 url 获取响应并更新 db 。然后,您可以使用 Firebase JobDispatcher 安排此服务。在 executionWindow 中,您必须指定作业在理想情况下应该运行的最早和最晚时间。

    如果您想在每 24 小时后安排作业,您可以使用执行窗口 (60*60*24,60*60*24+60)。然后如果您希望它应该每晚运行,那么您必须确保它最初安排在晚上。为此,您最初可以在安装应用程序时使用 AlarmManager 在夜间(仅一次)触发,并使用作业调度程序安排重复作业,或者另一种方式是基于与现在的差异和所需的执行您可以使用 jobdispatcher 安排非递归作业,该作业将在夜间运行,并且在该作业服务内您可以使用作业调度程序安排重复作业。

    ExecutionWindow 指定大致时间。不能保证它会在给定的窗口运行。如果错过了窗口,则作业将在理想情况下最早运行。对于重复作业,一旦作业完成,下一个作业将从作业上次运行的时间开始计算执行窗口时间。

    Job myJob = dispatcher.newJobBuilder()
                        .setTag("my-unique-tag")
                        .setRecurring(true)
                        .setLifetime(Lifetime.FOREVER)
                        .setService(MyJobService.class)
                        .setTrigger(Trigger.executionWindow(60*60*24,60*60*24+60))
                        .setReplaceCurrent(false)
                        .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
                        .setConstraints(Constraint.ON_ANY_NETWORK)
                        .setExtras(myExtrasBundle)
                        .build();
    
    dispatcher.mustSchedule(myJob);
    

    【讨论】:

    • 谢谢,我做了类似的事情。我会为其他人更新我的帖子。
    • @Bhuvnesh Varma :需要询问有关触发窗口的问题吗?
    • @young_08 请问您的问题是什么?
    • @BhuvneshVarma:您好,非常感谢您的回复。我现在真的需要一些 Firebase 作业调度程序的建议。我已经从应用程序类启动了我的调度程序。现在一切正常,直到应用程序进入后台或终止。我的调度程序没有运行。因此,我从调度程序的 onStart() 运行的位置服务也不起作用。请帮我解决一下这个。如果你愿意,我可以用代码发布问题。
    • @young_08 如果您可以使用您正在使用的代码发布问题会更好
    【解决方案2】:

    您可以通过告诉 Job.Builder 创建一个 recurring 作业来安排重复作业,该作业带有一个 Trigger,该作业具有根据您的需要执行的窗口。

    【讨论】:

    • 我想每 4 分钟安排一次任务会触发什么
    • @Doug 我想测试这个调度程序以在每 60 秒后运行我的工作。这是我的触发器,但我认为它不是每 60 秒工作一次。 .setTrigger(Trigger.executionWindow(60, 60 + 60))
    • @GauravArora 你发现代码以同样的方式工作了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 2018-02-05
    • 2019-11-24
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多