为啥 Firebase JobDispatcher 运行 JobService 2 次?
Posted
技术标签:
【中文标题】为啥 Firebase JobDispatcher 运行 JobService 2 次?【英文标题】:Why Firebase JobDispatcher run JobService 2 times?为什么 Firebase JobDispatcher 运行 JobService 2 次? 【发布时间】:2018-05-11 03:14:07 【问题描述】:来自 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
应该每次都增加。
感谢您的帮助
【问题讨论】:
我一直在努力解决同样的问题,但是,我使用内容 URI 作为触发器。我测试的两台设备都出现了这个问题,但如果我在模拟环境中构建应用程序,它只会运行一次。 【参考方案1】:我认为我们应该知道一些方法
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)
:这意味着不要用相同的标签覆盖现有作业。
【讨论】:
谢谢你的帮助:)【参考方案2】:我认为它运行 2 次的原因是您的执行窗口。
.setTrigger(Trigger.executionWindow(0,1))
只有 1 秒的时间窗口。
尝试使用更宽的间隔,例如 (0, 60)
,应该可以解决问题。
要回答关于变量i
的其他问题,您必须将其设为静态:
private static int i = 0;
【讨论】:
我怎样才能永远运行我的工作服务 您知道不是来自 github 的 Firebase JobDispatcher 的任何文档,以及任何其他资源 thnx 的答案@VollyNoob 0,60 也运行了两次 TestingJob: onStartJob 测试工作: Thu Nov 30 16:25:27 GMT+05:00 2017 TestingJob: onStartJob: i = 0 TestingJob: onStartJob 测试工作: Thu 2017 年 11 月 30 日 16:25:27 GMT+05:00 TestingJob:onStartJob:i = 0 这很奇怪,对我来说它有效。抱歉,我不知道任何其他文档【参考方案3】:您的int i
不会每次都增加。
setTrigger(Trigger.executionWindow(0, 60))
这个 JobTrigger 将确定创建的 Job 现在可以执行了。您已指定 0 到 1 秒的执行窗口。这就是为什么你的工作每秒钟都在触发。
这种触发很重要,因为重复作业总是需要执行窗口触发。当然,如果您的工作没有重复,您不必为其设置任何触发器。
您的第一个参数是 2 个作业之间的间隔时间(以秒为单位),第二个参数是间隔时间 + 同步的弹性时间(以秒为单位)。
【讨论】:
以上是关于为啥 Firebase JobDispatcher 运行 JobService 2 次?的主要内容,如果未能解决你的问题,请参考以下文章
Firebase Jobdispatcher - 现在开始并重复
Firebase jobdispatcher 未在指定窗口内触发
在 Firebase JobDispatcher 中更改定期任务的周期?
在firebase jobdispatcher中停止JobService内的计划作业