为什么Firebase JobDispatcher会运行JobService两次?

11

来自Firebase JobDispatcher文档Firebase JobDispatcher

setTrigger(Trigger.executionWindow(0, 60))
// start between 0 and 60 seconds

为什么我的服务会运行两次

Firebase JobDispatcher 代码

    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
    Job job = dispatcher.newJobBuilder()
            .setTag("testing job")
            .setService(TestingJob.class)
            .setReplaceCurrent(true)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(0,1))
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .setLifetime(Lifetime.FOREVER)
            .build();

    dispatcher.mustSchedule(job);

测试类(工作服务)

public class TestingJob extends JobService {

    private static final String TAG = "TestingJob";
    private int i =0;
    @Override
    public boolean onStartJob(JobParameters job) {

        Log.d(TAG, "onStartJob Testing Job: "+new Date().toString());
        Log.d(TAG, "onStartJob: i = "+String.valueOf(i));
        i+=1;
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters job) {

        Log.d(TAG, "onStopJob Testing Job: Stopped");
        return false;
    }
}

日志记录器

11-28 00:08:57.666 11793-11793: onStartJob Testing Job: Tue Nov 28 00:08:57 GMT+05:00 2017
11-28 00:08:57.666 11793-11793: onStartJob: i = 0
11-28 00:08:57.791 11793-11793: onStartJob Testing Job: Tue Nov 28 00:08:57 GMT+05:00 2017
11-28 00:08:57.791 11793-11793: onStartJob: i = 0

宣言

   <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <service android:name=".services.TestingJob"
            android:exported="false">
        <intent-filter>
            <action android:name="com.firebase.jobdispatcher.ACTION_EXECUTE"/>
        </intent-filter>
    </service>

我可以再次使用我的工作服务,这意味着int i应该每次递增。

感谢您的帮助。


1
我一直在为同样的问题苦苦挣扎,但是我使用内容URI作为触发器。这个问题在我测试的两个设备上都出现了,但如果我在模拟环境中构建应用程序,它只运行一次。 - Matthew White
3个回答

4
我认为我们应该了解一些方法。
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
    Job job = dispatcher.newJobBuilder()
            .setTag("testing job")
            .setService(TestingJob.class)
            .setReplaceCurrent(true)
            .setRecurring(true)
            .setTrigger(Trigger.executionWindow(0,1))
            .setConstraints(Constraint.ON_ANY_NETWORK)
            .setLifetime(Lifetime.FOREVER)
            .build();

    dispatcher.mustSchedule(job);

在这里你设置了:
.setRecurring(true):这意味着它会不断重复执行。使用开始时间和结束时间设置触发器:.setTrigger(Trigger.executionWindow(start, end)) .setReplaceCurrent(false):这意味着不要覆盖具有相同标签的现有作业。

感谢您的帮助 :) - Salman500

2
我认为它运行两次的原因是你的执行窗口。
.setTrigger(Trigger.executionWindow(0,1))

只有1秒的时间窗口。尝试使用更广泛的间隔,例如(0, 60),这应该可以解决问题。

回答您关于变量i的其他问题,您必须将其设置为静态:

private static int i = 0;

如何让我的作业服务永久运行? - Salman500
你知道Firebase JobDispatcher的其他文档资源吗?除了GitHub和Medium以外的。谢谢@VollyNoob的回答。 - Salman500
0,60也在运行两次TestingJob: onStartJob 测试任务:2017年11月30日星期四16:25:27 GMT+05:00 TestingJob: onStartJob: i = 0 TestingJob: onStartJob 测试任务:2017年11月30日星期四16:25:27 GMT+05:00 TestingJob: onStartJob: i = 0 - Salman500
很奇怪,对我来说它是可以工作的。抱歉,我不知道其他关于那个的文档。 - VollNoob

1
你的int i不会每次都增加。
setTrigger(Trigger.executionWindow(0, 60))

这个JobTrigger将确定已创建的作业现在准备好执行。您已指定了0到1秒的执行窗口。这就是为什么您的作业每秒都会触发。

这种触发非常重要,因为循环作业始终需要执行窗口触发器。当然,如果您的作业不是循环的,则不必为其设置任何触发器。

您的第一个参数是两个作业之间的时间间隔(以秒为单位),第二个参数是时间间隔加上同步弹性时间(以秒为单位)。


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