安卓 - Firebase jobdispatcher

13

我想知道是否可以使用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");
}
2个回答

16
您可以使用Firebase JobDispatcher来安排定期作业。根据您的要求,您需要创建一个扩展JobService的服务,该服务从URL获取响应并更新数据库。然后,您可以使用Firebase JobDispatcher调度此服务。在executionWindow中,您必须指定作业在理想情况下应运行的最早和最晚时间。
如果您想每隔24小时安排作业,则可以使用execution window (60*60*24,60*60*24+60)。如果您想让它每晚运行,那么您必须确保它最初安排在晚上。为此,您可以最初使用AlarmManager在晚上(仅一次)触发应用程序安装时,并使用作业调度程序安排重复作业,或者基于现在与所需执行时间之间的差异,您可以使用作业调度程序安排非递归作业,在夜间运行,并在该作业服务内使用作业调度程序安排重复作业。
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
@young_08 请问您有什么问题? - Android Developer
@BhuvneshVarma:你好,非常感谢您的回复。此时此刻我真的需要一些关于Firebase作业调度程序的建议。我已经从Application类中启动了我的调度程序。现在一切都运行正常,直到应用程序进入后台或被终止。我的调度程序无法运行。因此,我从调度程序的onStart()方法中运行的位置服务也无法工作。请帮助我解决这个问题。如果您想,我可以发布一份带有代码的问题。 - young_08
@young_08如果你能附上你正在使用的代码,那将会更好。 - Android Developer
@BhuvneshVarma 是的,没问题。这是链接 https://stackoverflow.com/questions/44772956/firebase-job-scheduler-not-working-in-background - young_08
显示剩余2条评论

1
你可以通过告诉Job.Builder创建一个具有根据你需要执行窗口的触发器的定期工作来安排定期工作。

1
我想要安排一个任务,每4分钟就会被触发。 - blackHawk
@Doug 我想测试这个调度程序,以便在每60秒后运行我的作业。这是我的触发器,但我不认为它每60秒就能工作。 .setTrigger(Trigger.executionWindow(60, 60 + 60)) - Gaurav Arora
@GauravArora,你找到让代码以相同方式工作的方法了吗? - Maveňツ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接