[JAVA] Ihre Verwendung von JobScheduler ist falsch

Was ist los

In den wichtigsten japanischen Kommentarartikeln ist die Art und Weise, JobService.jobFinished (JobParameters, boolean) aufzurufen, fast falsch [^ 1]. Es kann wie folgt beschrieben werden, aber dies ist falsch.

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

Ebenso gibt es einen Artikel, in dem "jobFinished" "onStopJob" aufruft, der aber auch falsch ist.

Lesen Sie Javadoc

Laut Javadoc ist "jobFinished"

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.

Es steht geschrieben. Übersetzt: "Durch Aufrufen dieser Methode ** wird JobScheduler benachrichtigt, dass der Job abgeschlossen ist **. Wenn das System diese Benachrichtigung erhält, gibt es das Wakelock frei, das es für diesen Job erhalten hat." .. Mit anderen Worten, wenn jobFinished () aufgerufen wird, interpretiert Android, dass die Ausführung des registrierten Jobs abgeschlossen ist, und gibt die Sperre frei.

onStopJob wird in Javadoc wie folgt beschrieben.

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.

Mit anderen Worten: "Diese Methode wird aufgerufen, wenn Sie einen laufenden Job beenden müssen, bevor Sie jobFinished () aufrufen können (dh bevor der Job beendet ist). Wurde von JobScheduler aufgefordert, einen Job unter bestimmten Bedingungen aufzurufen, sodass der Job aufgerufen wurde, als die Bedingung erfüllt war. Er tritt jedoch auf, wenn die Bedingung während der Ausführung verletzt wird. Wenn Sie beispielsweise JobScheduler gebeten haben, einen Job aufzurufen, wenn eine Verbindung zu WiFi besteht, wurde der Job aufgerufen, weil er mit WiFi verbunden war, aber die WiFi-Verbindung wurde unterbrochen, während der Job ausgeführt wurde. ". Mit anderen Worten, der erwartete Wert beim Aufruf dieser Methode lautet "** Stop the running job " und " Benachrichtigen, dass der Job abgeschlossen ist ** (Call jobFinished". Das ist nicht.

Richtige Verarbeitung

Beenden Sie den Job, wenn "onStopJob ()" aufgerufen wird.

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

Sie müssen sich keine Sorgen um Wakelock machen, da es freigegeben wird, wenn Sie es mit der onStopJob-Methode zurückgeben.

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

Was ist der Beispielcode von Google?

Wenn Sie sich googlesamples ansehen,

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

Der Prozess wird durch Senden der Nachricht "MSG_COLOR_STOP" gestoppt. Natürlich habe ich es nicht "jobFinished ()" genannt.

[^ 1]: Bei der Suche nach "Android JobScheduler onStopJob" sind 3 der 4 japanischen Artikel, die auf der ersten Seite erscheinen, falsch. Einer ist unterimplementiert. Mit anderen Worten, Vernichtung.

Recommended Posts

Ihre Verwendung von JobScheduler ist falsch
Verwendung der Datumsklasse
Die Essenz von AspectJs Stimmung - warum Ihr "@ Transactional" ignoriert wird
Verwenden Sie @ValueSource von ParametrisedTest von JUnit5