마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Firebase job dispatcher 실행 주기(setTrigger) 질문입니다.

0 추천
안드로이드 펍에는 gcm, database 등 과 같은 질문 밖에 찾지 못하였고

구글링을 해보면 자기가 원하는 주기로 안돌아가는 사람들이 있긴한데 다들 답변으로 해결이 되더라고요

저도 조금은 이해를 하고 답변대로 해봐도 실행 주기가 변하지 않는게 제가 이해를 잘 못한건지 뭔가 잘못 사용하고 있는건지 궁금해서 질문 드립니다.

저는 setTrigger의 인자들을 적게주건 크게주건 실행 주기에 영향을 주지 않았습니다.

firebase job dispatcher의 .setTrigger(60, 60+5), .setRecurring(true) 의미 하는게

반복해서 실행 할 것이고, 서비스를 호출하고 60초 이후 60 + 5초 이내에 실행한다는게 맞지 않나요?

job생성

https://github.com/j0n9m1n1/real2/blob/master/app/src/main/java/com/example/entitys/real/activity/ReportActivity.java
238~262라인

service

https://github.com/j0n9m1n1/real2/blob/master/app/src/main/java/com/example/entitys/real/service/GetReportService.java

https://github.com/firebase/firebase-jobdispatcher-android

다른건 다 예상한 대로 백그라운드에서도 잘 실행이 되는데 주기만 문제입니다.

실행 결과 입니다.

2018-12-09 03:42:57 start
2018-12-09 03:45:42 3
2018-12-09 03:47:04 2
2018-12-09 03:52:44 5
2018-12-09 03:58:33 6
2018-12-09 04:10:18 12
2018-12-09 04:15:04 15
2018-12-09 04:23:04 8
2018-12-09 04:31:40 8
2018-12-09 04:44:16 13
2018-12-09 04:51:04 7
2018-12-09 05:27:41 36

주기를 3600s로 줬는데도 한 시간 이상이 지나고 실행 된적은 한 번도 없고, 실행 주기를 이해 할 수 없었습니다ㅠㅠ
reallyNewbie (150 포인트) 님이 2018년 12월 8일 질문
reallyNewbie님이 2018년 12월 9일 수정
혹시 앱 삭제하고 다시 해보신적은 있으세요? 저도 같은증상이었는데  Job cancel이 안되고 남아있는것 같아서 앱삭제하고 다시 빌드해서 정상작동중이거든요. 저도 1시간 단위로 서비스 실행되도록 하고있는데, 저 주기에 대한 답변을 저도 아직 받지못해서 ㅠㅠ고통이네요. 1시간단위로 실행은되지만 오차가 짧게는 몇분 길게는 몇십분 차이로 불규칙적으로 오차가 생기네요.
네 혹시나 하는 마음 트리거 값 바꿀 떄 마다 삭제하면서 디버깅 해도 저는 그대로 더라고요
혹시 소스코드좀 볼 수 있을까요?
제 코드랑 어디가 다른지 궁금해서요ㅠㅠ
service에 onstart return값 false로 주니까 잘 되네요
아직 세시간째긴 한데 오차도 크게 없습니다
(주기 - 오차, 주기)로 줬습니다


.setTrigger(JobDispatcherUtils.periodicTrigger(3600, 20))

public class JobDispatcherUtils {
    public static JobTrigger periodicTrigger(int frequency, int tolerance) {
        return Trigger.executionWindow(frequency - tolerance, frequency);
    }
}
Job myJob = mDispatcher.newJobBuilder()
                .setTag(JOB_TAG)
                .setRecurring(true)
                .setLifetime(Lifetime.FOREVER)
                .setService(UpdateDbService.class)
                .setTrigger(JobDispatcherUtils.periodicTrigger(60*60, 1))
                .setReplaceCurrent(false) // 같은 이름의 태그로 지정된 작업 덮어쓰기
                .setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
                .build();
         
mDispatcher.mustSchedule(myJob);

잡 생성은 이렇구요 전 서비스클래스가 SimpleJobService인데 이 클래스가 JobService 상속받은 클래스라 차이가 없을것 같습니다.
전 JobDispatcher주기 때문에 WorkManager도 한번 써봤는데, 내부적으로 예전 서비스들 유동적으로 사용해서 그런지 JobDispatcher때랑 차이가 없었는데, 한가지 특이한점이 Work서비스에서 결과값으로 Result.retry()해주면 정확하게 1분단위로 서비스를 계속 재 호출해주더라구요. 이쪽도 알아보시면 좋지 않을까 해요.
2018-12-09 19:40:18.970 20646-24296/com.example.entitys.real D/JOB TEST: JOB TEST
2018-12-09 20:40:19.248 20646-25673/com.example.entitys.real D/JOB TEST: JOB TEST
2018-12-09 21:41:41.388 20646-27451/com.example.entitys.real D/JOB TEST: JOB TEST
2018-12-09 22:42:06.022 20646-30270/com.example.entitys.real D/JOB TEST: JOB TEST

저는 제가 원하는 기준으로 오차범위도 크지 않고 한 시간 마다 되길 원했는데 되네요 감사합니다

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...