11

来自 Firebase JobDispatcher 文档Firebase JobDispatcher

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

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

Firebase JobDispacther 代码

    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每次都应该增加。

感谢您的帮助

4

3 回答 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):这意味着不断重复它。使用 start 和 end 设置触发器 .setTrigger(Trigger.executionWindow(start, end))

.setReplaceCurrent(false):这意味着不要用相同的标签覆盖现有的工作。

于 2018-02-27T05:02:54.207 回答
2

我认为它运行 2 次的原因是你的执行窗口。

.setTrigger(Trigger.executionWindow(0,1))

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

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

private static int i = 0;
于 2017-11-29T14:27:20.113 回答
1

int i不会每次都增加。

setTrigger(Trigger.executionWindow(0, 60))

这个 JobTrigger 将确定创建的 Job 现在可以执行了。您已指定 0 到 1 秒的执行窗口。这就是为什么你的工作每秒钟都在触发。

这种触发很重要,因为重复作业总是需要执行窗口触发器。当然,如果您的工作没有重复出现,您不必为它设置任何触发器。

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

于 2018-02-24T19:47:08.010 回答