2017-11-27 3 views
11

, wie von Firebase JobDispatcher Dokumentation Firebase JobDispatcherWarum Firebase JobDispatcher JobService 2 Mal ausführen?

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

aber warum meine Sevice zwei Mal

Firebase JobDispacther-Code ausgeführt wird

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); 

Testing Klasse (J ob Dienst)

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; 
    } 
} 

Log 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 

Manifest

<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> 

Kann ich meinen Job Service nutzen Wieder bedeuten int i sollte jedes Mal erhöht werden.

Thnx für Ihre Hilfe

+1

Ich habe mit dem gleichen Problem gekämpft, jedoch verwende ich eine Inhalts-URI als Auslöser. Das Problem ist auf beiden Geräten aufgetreten, mit denen ich getestet habe. Wenn ich die Anwendung jedoch in einer emulierten Umgebung erstelle, wird sie nur einmal ausgeführt. –

Antwort

3

denke ich, einige Verfahren sollten wir sein, darüber wissen

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); 

in diesem Set Sie
.setRecurring(true): das heißt, es wird kontinuierlich wiederholt. stellen Sie den Auslöser mit Start und Ende .setTrigger(Trigger.executionWindow(start, end)):

Start: als windowStart wird wissen, was die früheste Zeit (in Sekunden) der Job förderfähig angesehen werden soll laufen. Berechnet ab dem Zeitpunkt der Auftragserteilung (für neue Aufträge)

Ende: ist als windowEnd bekannt, die letzte Zeit (in Sekunden) sollte der Job in einer idealen Welt ausgeführt werden. Auf die gleiche Weise berechnet wie windowStart.

.setReplaceCurrent(false): Das bedeutet, dass ein vorhandener Job nicht mit demselben Tag überschrieben wird.

Hoffe es wird dir helfen !!

+0

Thnx für Ihre Hilfe :) – Salman500

+0

@ Salman500 willkommen! –

2

Ich denke, der Grund, warum es läuft 2mal ist Ihr Ausführungsfenster.

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

Es gibt nur ein 1-Sekunden-Zeitfenster. Versuchen Sie mit einem breiteren Intervall, wie (0, 60), das sollte den Trick tun.

Um Ihre andere Frage über Ihre Variable i, beantworten müssen Sie es statisch machen:

private static int i = 0; 
+0

wie kann ich meinen Job Service laufen immer – Salman500

+0

wissen Sie alle Unterlagen für Firebase JobDispatcher nicht von Github und mittlere andere Ressource thnx für die Antwort @VollyNoob – Salman500

+0

0,60 auch zwei Mal ausgeführt wird TestingJob: onStartJob Testing Job : Do 30. November 16:25:27 GMT + 05: 00 2017 TestingJob: onStartJob: i = 0 TestingJob: onStartJob Testing Job: Do 30. November 16:25:27 GMT + 05: 00 2017 TestingJob: onStartJob: i = 0 – Salman500

1

Ihre int i wird jedes Mal, nicht erhöhen.

setTrigger(Trigger.executionWindow(0, 60)) 

Und dieser JobTrigger wird feststellen, dass der erstellte Job nun zur Ausführung bereit ist. Sie haben ein Ausführungsfenster von 0 bis 1 Sekunden angegeben. Deshalb löst Ihr Job jede Sekunde aus.

Diese Auslösung ist wichtig, da wiederkehrende Jobs immer einen Ausführungsfensterauslöser benötigen. Wenn Ihr Job nicht wiederkehrend ist, müssen Sie natürlich keinen Trigger dafür setzen.

Ihr erster Parameter ist die Intervallzeit in Sekunden zwischen 2 Jobs und der zweite Parameter ist die Intervallzeit + die synchronisierte Gleitzeit in Sekunden.

Verwandte Themen