为什么 Firebase JobDispatcher 运行 JobService 2 次?
Why Firebase JobDispatcher run JobService 2 times?
来自 Firebase JobDispatcher 文档 Firebase JobDispatcher
setTrigger(Trigger.executionWindow(0, 60))
// start between 0 and 60 seconds
但是为什么我的服务运行两次
Firebase JobDispacter 代码
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);
测试class(工作服务)
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
应该每次都递增。
感谢您的帮助
我认为它运行2次的原因是你的执行window。
.setTrigger(Trigger.executionWindow(0,1))
只有1秒window。
尝试使用更宽的间隔,例如 (0, 60)
,应该可以解决问题。
要回答关于变量 i
的其他问题,您必须将其设为静态:
private static int i = 0;
你的int i
不会每次都递增。
setTrigger(Trigger.executionWindow(0, 60))
而这个 JobTrigger 将确定创建的 Job 现在可以执行了。您指定了 0 到 1 秒的执行 window。这就是为什么你的工作每秒都在触发。
这个触发很重要,因为重复作业总是需要执行 window 触发器。当然,如果你的工作不是经常性的,你就不用设置任何触发器。
您的第一个参数是两个作业之间的间隔时间(以秒为单位),第二个参数是间隔时间 + 以秒为单位的同步弹性时间。
我认为我们应该知道一些方法
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)
:这意味着不要覆盖具有相同标签的现有作业。
来自 Firebase JobDispatcher 文档 Firebase JobDispatcher
setTrigger(Trigger.executionWindow(0, 60))
// start between 0 and 60 seconds
但是为什么我的服务运行两次
Firebase JobDispacter 代码
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);
测试class(工作服务)
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
应该每次都递增。
感谢您的帮助
我认为它运行2次的原因是你的执行window。
.setTrigger(Trigger.executionWindow(0,1))
只有1秒window。
尝试使用更宽的间隔,例如 (0, 60)
,应该可以解决问题。
要回答关于变量 i
的其他问题,您必须将其设为静态:
private static int i = 0;
你的int i
不会每次都递增。
setTrigger(Trigger.executionWindow(0, 60))
而这个 JobTrigger 将确定创建的 Job 现在可以执行了。您指定了 0 到 1 秒的执行 window。这就是为什么你的工作每秒都在触发。
这个触发很重要,因为重复作业总是需要执行 window 触发器。当然,如果你的工作不是经常性的,你就不用设置任何触发器。
您的第一个参数是两个作业之间的间隔时间(以秒为单位),第二个参数是间隔时间 + 以秒为单位的同步弹性时间。
我认为我们应该知道一些方法
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)
:这意味着不要覆盖具有相同标签的现有作业。