Почему Firebase JobDispatcher запускает JobService 2 раза?
Как из Firebase JobDispatcher Documentation Firebase JobDispatcher
setTrigger(Trigger.executionWindow(0, 60))
// start between 0 and 60 seconds
, но почему мой сеанс работает два раза
Firebase JobDispacther Code
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;
}
}
Журнал Cat
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>
Могу ли я использовать сервис Job Service снова, значение int i
должно увеличиваться каждый раз.
Thnx для вашей помощи
Ответы
Ответ 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)
: это означает, что он постоянно повторяется.
установить триггер с начала и конца
.setTrigger(Trigger.executionWindow(start, end))
:
start: известен как windowStart, который является самым ранним временем (в секундах), работа должна считаться подходящей для запуска. Вычисляется с момента назначения задания (для новых заданий)
end: известно как windowEnd, последнее время (в секундах) задание должно выполняться в идеальном мире. Вычисляется так же, как windowStart.
.setReplaceCurrent(false)
: это означает, что вы не перезаписываете существующее задание тем же тегом.
Надеюсь, это поможет вам!
Ответ 2
Я думаю, что причина, по которой он работает 2 раза, - это ваше окно выполнения.
.setTrigger(Trigger.executionWindow(0,1))
Существует только 1-секундное окно времени.
Попробуйте более широкий интервал, например (0, 60)
, который должен сделать трюк.
Чтобы ответить на другой вопрос о вашей переменной i
, вы должны сделать ее статической:
private static int i = 0;
Ответ 3
Ваш int i
не будет увеличиваться каждый раз.
setTrigger(Trigger.executionWindow(0, 60))
И этот JobTrigger определит, что созданное задание теперь готово к выполнению. Вы указали окно выполнения от 0 до 1 секунды. Вот почему ваша работа запускается каждую секунду.
Это срабатывание важно, поскольку для повторяющихся заданий всегда требуется триггер окна выполнения. Конечно, если ваша работа не повторяется, вам не нужно устанавливать какой-либо триггер для нее.
Ваш первый параметр - это интервал времени в секундах между 2 заданиями, а вторым параметром является интервал времени + синхронизированный флексимум в секундах.