2017-11-27 8 views
11

Firebase JobDispatcherFirebase JobDispatcher가 JobService를 2 번 실행하는 이유는 무엇입니까? 중포 기지 JobDispatcher 문서에서 다른 이름으로

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

그런데 왜 내 서비스로서 두 시간을 실행

중포 기지 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); 

테스트 클래스 (J 산부인과 서비스)

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은 매번 증가합니다. 여러분의 도움

+1

나는 동일한 문제로 어려움을 겪어 왔지만 콘텐츠 URI를 트리거로 사용하고 있습니다. 이 문제는 내가 테스트 한 두 장치에서 발생했지만 에뮬레이트 된 환경에서 응용 프로그램을 빌드하면 한 번만 실행됩니다. 또한 두 번 를 실행 내가 내 일 서비스를 실행할 수있는 방법을 –

답변

3

는 나는이에

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) 설정에 대해 우리가 할 몇 가지 방법을 알고 있다고 생각 : 지속적으로 반복 것을 의미한다.작업을 실행할 자격이 고려되어야한다 (초) 빠른 시간 windowStart으로 알고있다 :

시작 : 는 시작과 끝 .setTrigger(Trigger.executionWindow(start, end))와 트리거를 설정합니다. 작업이 예정된 시간 (새로운 작업의 경우)부터 계산 된 것입니다.

: 알고있는 windowEnd는 가장 이상적인 세계에서 작업을 실행해야하는 최신 시간 (초)입니다. windowStart와 같은 방법으로 계산됩니다.

.setReplaceCurrent(false) : 기존 작업을 동일한 태그로 덮어 쓰지 않는다는 뜻입니다.

희망이 있으면 도움이 될 것입니다.

+0

thnx : – Salman500

+0

@ Salman500 welcome !! –

2

를 들어

Thnx 나는이 2 번 실행하는 이유는 당신의 실행 창 생각합니다.

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

시간 창이 1 초 밖에 없습니다. (0, 60)과 같은 더 넓은 간격으로 시도해보십시오.

이 변수 i에 대한 다른 질문에 대답하기 위해, 당신은 그것을 정적 확인해야합니다 :

private static int i = 0; 
+0

영원히 – Salman500

+0

당신은 중포 기지 JobDispatcher에 대한하지 GitHub의 중간 응답 @VollyNoob – Salman500

+0

0,60에 대한 다른 자원 thnx을에서 모든 문서를 알고 TestingJob : onStartJob 테스트 작업 : Thu Nov 30 16:25:27 GMT + 05 : 00 2017 TestingJob : onStartJob : i = 0 TestingJob : onStartJob 테스트 작업 : 11 월 30 일 16:25:27 GMT + 05 : 00 2017 TestingJob : onStartJob : i = 0 – Salman500

1

당신의 int i 때마다 증가하지 않습니다.

setTrigger(Trigger.executionWindow(0, 60)) 

그리고이 JobTrigger는 작성된 작업을 실행할 준비가되었다고 판단합니다. 실행 창을 0에서 1 초로 지정했습니다. 그래서 매 초마다 당신의 직업이 촉발됩니다.

되풀이 작업은 항상 실행 창 트리거가 필요하기 때문에이 트리거링은 중요합니다. 물론 작업이 반복되지 않으면 트리거를 설정할 필요가 없습니다.

첫 번째 매개 변수는 2 개의 작업 사이의 간격 시간 (초)이고 두 번째 매개 변수는 간격 시간 + 동기화 된 플렉스 타임 (초)입니다.