Zaktualizuj zadania, które są już w kolejce

WorkManager umożliwia aktualizację WorkRequest po wykonaniu dodał go do kolejki. Jest to często konieczne w większych aplikacjach, które często się zmieniają lub konieczności aktualizowania instancji roboczych na bieżąco. Stan na platformie WorkManager wersji 2.8.0, umożliwia to interfejs API updateWork().

Metoda updateWork() pozwala zmienić określone aspekty WorkRequest na bieżąco, bez konieczności ręcznego konfigurowania anulowanie nowego i dodanie go do kolejki. To znacznie upraszcza tworzenie proces tworzenia konta.

Unikaj anulowania pracy

Zasadniczo należy unikać anulowania istniejącego żądania WorkRequest i dodawania do kolejki nowego jeden. Może to spowodować powtarzanie określonych zadań przez aplikację i wymaganie w celu napisania dużej ilości dodatkowego kodu.

Weź pod uwagę te przykłady sytuacji, w których anulowanie żądania WorkRequest może spowodować trudności:

  • Żądanie backendu: jeśli anulujesz Worker na czas przetwarzania danych. ładunek, który ma zostać wysłany na serwer, nowy Worker musi zaczynać się od początku aby ponownie obliczyć potencjalnie kosztowny ładunek.
  • Harmonogram: jeśli anulujesz PeriodicWorkRequest i np. nowe PeriodicWorkRequest do wykonywania według tego samego harmonogramu, musisz aby obliczyć przesunięcie czasu i zapewnić zgodność nowego czasu wykonywania z poprzednim zadaniem.

Interfejs updateWork() API umożliwia aktualizowanie ograniczeń żądania roboczego oraz innych parametrów bez konieczności anulowania nowego żądania i dodania go do kolejki.

Kiedy anulować pracę

W niektórych przypadkach musisz bezpośrednio anulować subskrypcję WorkRequest, a nie Zadzwoń pod numer updateWork(). Zrób to, gdy chcesz zmienić zasadniczego charakteru prac umieszczonych w kolejce.

Kiedy zaktualizować adres służbowy

Wyobraź sobie aplikację do zdjęć, która codziennie tworzy kopię zapasową zdjęć użytkownika. Zawiera dodał(a) do kolejki PeriodicWorkRequest. WorkRequest ma ograniczenia które wymagają ładowania urządzenia i połączenia z Wi-Fi.

Użytkownik ładuje jednak urządzenie tylko przez 20 minut dziennie, korzystając z szybkiego ładowarki. W takim przypadku aplikacja może zaktualizować WorkRequest, aby złagodzić ograniczenia ładowania, dzięki czemu może on przesyłać zdjęcia nawet wtedy, gdy Bateria nie jest w pełni naładowana.

W takiej sytuacji możesz zaktualizować utwór przy użyciu metody updateWork() ze względu na ograniczenia żądania.

Jak zaktualizować adres służbowy

Metoda updateWork() pozwala w prosty sposób zaktualizować WorkRequest bez konieczności anulowania kolejnego wydarzenia i dodania nowego do kolejki.

Aby użyć zadania aktualizacji w kolejce, wykonaj te czynności:

  1. Uzyskaj istniejący identyfikator zadania w kolejce: uzyskaj identyfikator obiektu WorkRequest, którego chcesz wprowadzić zmiany. Możesz go uzyskać za pomocą dowolnej z interfejsów API getWorkInfo lub przez ręczne zapisanie identyfikatora z początkowego WorkRequest do późniejszego pobrania za pomocą właściwości publicznej WorkRequest.id, przed dodaniem go do kolejki.
  2. Create new WorkRequest: utwórz nowy element WorkRequest i użyj WorkRequest.Builder.setID(), aby ustawić swój identyfikator tak, aby był zgodny z identyfikatorem WorkRequest
  3. Ustaw ograniczenia: użyj WorkRequest.Builder.setConstraints(), aby przekazać Nowe ograniczenia WorkManagera.
  4. Call updateWork: przekaż nowe żądanie WorkRequest do updateWork().

Przykład aktualizacji profilu służbowego

Oto przykładowy fragment kodu w języku Kotlin, który pokazuje, jak korzystać z biblioteki Metoda updateWork() do zmiany ograniczeń dotyczących baterii dla używanego urządzenia WorkRequest aby przesłać zdjęcia:

suspend fun updatePhotoUploadWork() {
    // Get instance of WorkManager.
    val workManager = WorkManager.getInstance(context)

    // Retrieve the work request ID. In this example, the work being updated is unique
    // work so we can retrieve the ID using the unique work name.
    val photoUploadWorkInfoList = workManager.getWorkInfosForUniqueWork(
        PHOTO_UPLOAD_WORK_NAME
    ).await()

    val existingWorkRequestId = photoUploadWorkInfoList.firstOrNull()?.id ?: return

    // Update the constraints of the WorkRequest to not require a charging device.
    val newConstraints = Constraints.Builder()
        // Add other constraints as required here.
        .setRequiresCharging(false)
        .build()

    // Create new WorkRequest from existing Worker, new constraints, and the id of the old WorkRequest.
    val updatedWorkRequest: WorkRequest =
        OneTimeWorkRequestBuilder<MyWorker>()
            .setConstraints(newConstraints)
            .setId(existingWorkRequestId)
            .build()

    // Pass the new WorkRequest to updateWork().
    workManager.updateWork(updatedWorkRequest)
}

Obsługa wyników

updateWork() zwraca wartość ListenableFuture<UpdateResult>. Podana wartość UpdateResult może mieć jedną z kilku wartości określających, czy Usłudze WorkManager udało się zastosować zmiany. Wskazuje też, kiedy udało mu się aby zastosować zmianę.

Więcej informacji: updateWork() i UpdateResult. odniesienie.

Śledź pracę z pokoleniami

Za każdym razem, gdy aktualizujesz obiekt WorkRequest, jego generowanie zwiększa się o 1. Ten pozwala śledzić, który element WorkRequest znajduje się obecnie w kolejce. Generacje zapewniają większą kontrolę podczas obserwowania, śledzenia i testowania pracy żądań.

Aby wygenerować WorkRequest, wykonaj te czynności:

  1. WorkInfo: wywołaj WorkManager.getWorkInfoById(), by pobrać instancję z WorkInfo odpowiadające Twoim WorkRequest.
    • Możesz wywołać jedną z kilku metod, które zwracają WorkInfo. Więcej więcej informacji znajdziesz w dokumentacji WorkManager.
  2. getGeneration: wywołaj getGeneration() w instancji WorkInfo. Zwrócona wartość Int odpowiada wygenerowaniem WorkRequest
    • Pamiętaj, że nie ma pola ani właściwości generowania, a jedynie Metoda WorkInfo.getGeneration().

Przykład generowania ścieżek

Poniżej znajduje się przykład implementacji przepływu pracy opisanego powyżej w przypadku pobieranie generacji WorkRequest.

// Get instance of WorkManager.
val workManager = WorkManager.getInstance(context)

// Retrieve WorkInfo instance.
val workInfo = workManager.getWorkInfoById(oldWorkRequestId)

// Call getGeneration to retrieve the generation.
val generation = workInfo.getGeneration()

Zasady dotyczące aktualizowania informacji o pracy

Wcześniej zalecanym rozwiązaniem przy aktualizowaniu zadań okresowych było umieszczenie PeriodicWorkRequest z zasadami ExistingPeriodicWorkPolicy.REPLACE. Jeśli była oczekująca płatność PeriodicWorkRequest z tym samym unikalnym identyfikatorem id, nowy prośba o pracę zostałaby anulowana i usunięta. Ta zasada została wycofana w: z korzyścią dla przepływu pracy za pomocą ExistingPeriodicWorkPolicy.UPDATE.

Na przykład gdy używasz enqueueUniquePeriodicWork z atrybutem PeriodicWorkRequest, możesz zainicjować nową aplikację PeriodicWorkRequest za pomocą ExistingPeriodicWorkPolicy.UPDATE. Jeśli jest oczekująca PeriodicWorkRequest o tej samej unikalnej nazwie, WorkManager zaktualizuje ją do nowej specyfikacji. Zgodnie z tym przepływem pracy nie trzeba używać updateWork()