[JAVA] Votre utilisation de JobScheduler est incorrecte

Qu'est-ce qui ne va pas

Dans les principaux articles de commentaires japonais, la façon d'appeler JobService.jobFinished (JobParameters, boolean) est presque fausse [^ 1]. Cela peut être décrit comme suit, mais c'est incorrect.

@override
public boolean onStopJob(JobParameters params) {
  jobFinished(params, false);
  return false;
}

De même, il y a un article qui appelle jobFinished appelle ʻonStopJob`, mais qui est également incorrect.

Lire Javadoc

Selon Javadoc, jobFinished est

Call this to inform the JobScheduler that the job has finished its work. When the system receives this message, it releases the wakelock being held for the job.

Il est écrit. Traduit, "L'appel de cette méthode ** notifie JobScheduler que le travail est terminé **. Lorsque le système reçoit cette notification, il libère le wakelock qu'il obtenait pour ce travail." .. En d'autres termes, lorsque jobFinished () est appelé, Android interprète que le travail enregistré a fini de s'exécuter et libère le verrou.

ʻOnStopJob` est décrit dans Javadoc comme suit.

This method is called if the system has determined that you must stop execution of your job even before you've had a chance to call jobFinished(JobParameters, boolean).

This will happen if the requirements specified at schedule time are no longer met. For example you may have requested WiFi with JobInfo.Builder.setRequiredNetworkType(int), yet while your job was executing the user toggled WiFi. Another example is if you had specified JobInfo.Builder.setRequiresDeviceIdle(boolean), and the phone left its idle maintenance window.

En d'autres termes, «Cette méthode est appelée lorsque vous devez ** arrêter un travail en cours ** avant d'avoir la possibilité d'appeler jobFinished () (c'est-à-dire avant que le travail ne se termine). A été demandé à JobScheduler d'appeler un travail dans certaines conditions, le travail a donc été appelé lorsque la condition était remplie, mais il se produit lorsque la condition est violée pendant l'exécution. Par exemple, si vous demandiez à JobScheduler d'appeler un travail lorsqu'il était connecté au WiFi, le travail a été appelé car il était connecté au WiFi, mais la connexion WiFi a été coupée pendant l'exécution du travail. ". En d'autres termes, la valeur attendue lorsque cette méthode est appelée est "** Arrêter le travail en cours " et " Notifier que le travail est terminé ** (Appeler jobFinished". Ce n'est pas.

Traitement correct

Arrêtez le travail lorsque ʻonStopJob () `est appelé.

@override
public boolean onStopJob(JobParameters params) {
  stopYourJobImmediately();
  return false;
}

Vous n'avez pas à vous soucier de wakelock car il sera libéré lorsque vous le retournerez avec la méthode onStopJob.

Once this method returns, the system releases the wakelock that it is holding on behalf of the job.

Quel est l'exemple de code de Google?

Si vous regardez googlesamples,

    @Override
    public boolean onStopJob(JobParameters params) {
        // Stop tracking these job parameters, as we've 'finished' executing.
        sendMessage(MSG_COLOR_STOP, params.getJobId());
        Log.i(TAG, "on stop job: " + params.getJobId());

        // Return false to drop the job.
        return false;
    }

Le processus est arrêté par l'envoi du message «MSG_COLOR_STOP». Bien sûr, je ne l'ai pas appelé «jobFinished ()».

[^ 1]: Recherche de "Android JobScheduler onStopJob", 3 des 4 articles japonais qui apparaissent sur la première page sont incorrects. L'un est sous-mis en œuvre. En d'autres termes, l'anéantissement.

Recommended Posts

Votre utilisation de JobScheduler est incorrecte
Utilisation de la classe Date
L'essence de l'humeur d'AspectJ - pourquoi votre `@ Transactional` est ignoré
Utilisez @ValueSource de ParametrisedTest de JUnit5