2017-11-18 4 views
0

Ich versuche einen periodischen Job zu planen, der alle 15 Minuten ausgeführt wird, indem Sie android-job von evernote verwenden. Das Problem ist, dass der Job 2-3 Mal ausgeführt wird und dann nicht alle 15 Minuten ausgeführt wird. Innerhalb von 8 Stunden lief es fast 10-11 Mal, wenn das Gerät im Leerlauf war. Gibt es etwas, was ich falsch mache? Die einzige Anforderung, die mein Job hat, ist Netzwerk sollte verbunden sein, die verbunden war.Periodischer Job wird nicht konsistent ausgeführt, wenn Evernote Android-Job-Bibliothek verwendet wird

Erfordert Android-Job-Bibliothek etwas, dass Job ausgeführt wird? Dies ist mein Code für den Job

public class TestNetworkJob extends Job { 

    public static final String TAG = "TestNetworkJob"; 

    @NonNull 
    @Override 
    protected Result onRunJob(Params params) { 
     Timber.i("onRunJob"); 

     RetrofitUtils.getInstance().postSlack("TestCall: " + DateTimeUtils.getLocalizedDateTimeString(System 
       .currentTimeMillis())); 
     return Result.SUCCESS; 

    } 

    public static JobRequest buildJobRequest() { 
     return new JobRequest.Builder(TAG) 
       .setUpdateCurrent(true) 
       .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED) 
       .setPeriodic(TimeUnit.MINUTES.toMillis(15)) 
       .build(); 
    } 
} 
+0

Das klingt wie typisches Doze-Modus-Verhalten. Die Evernote-Bibliothek wirkt dem nicht entgegen. – CommonsWare

+0

Wie können wir sicherstellen, dass alle 15 Minuten ein Job ausgeführt wird? Ich dachte, das wäre der entscheidende Punkt bei der Verwendung von Job-Scheduler-APIs. @CommonsWare – NinjaCoder

Antwort

0

Grundsätzlich in Spannweite von 8 Stunden fast 10-11 mal lief, wenn das Gerät wurde im Leerlauf

, die wie Standard Doze-Modus Verhalten Klänge, die Sie werden auf Android 6.0 + Geräten begegnen.

Ich dachte, dass der ganze Sinn der Verwendung von Job-Scheduler-APIs

Oh, $DEITY, keine war. Der Punkt hinter der Verwendung von JobScheduler (oder Wrapper um ihn herum) ist die Batterie freundlich zu sein.

Wie können wir sicherstellen, dass alle 15 Minuten ein Job ausgeführt wird?

In der Regel nicht.

Google möchte, dass Sie die Abfrage abbrechen und für serverseitige Push-Nachrichten zu Firebase Cloud Messaging wechseln. Sie können gerne mit setAndAllowWhileIdle()/setExactAndAllowWhileIdle() unter AlarmManager experimentieren. Aber im Großen und Ganzen bedeutet der Krieg gegen Hintergrundverarbeitung, dass periodische Hintergrundarbeit bestenfalls schwierig ist.

Verwandte Themen