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, nowyWorker
musi zaczynać się od początku aby ponownie obliczyć potencjalnie kosztowny ładunek. - Harmonogram: jeśli anulujesz
PeriodicWorkRequest
i np. nowePeriodicWorkRequest
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:
- 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 publicznejWorkRequest.id
, przed dodaniem go do kolejki. - Create new WorkRequest: utwórz nowy element
WorkRequest
i użyjWorkRequest.Builder.setID()
, aby ustawić swój identyfikator tak, aby był zgodny z identyfikatoremWorkRequest
- Ustaw ograniczenia: użyj
WorkRequest.Builder.setConstraints()
, aby przekazać Nowe ograniczenia WorkManagera. - 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:
- WorkInfo: wywołaj
WorkManager.getWorkInfoById()
, by pobrać instancję zWorkInfo
odpowiadające TwoimWorkRequest
.- Możesz wywołać jedną z kilku metod, które zwracają
WorkInfo
. Więcej więcej informacji znajdziesz w dokumentacji WorkManager.
- Możesz wywołać jedną z kilku metod, które zwracają
- getGeneration: wywołaj
getGeneration()
w instancjiWorkInfo
. Zwrócona wartośćInt
odpowiada wygenerowaniemWorkRequest
- Pamiętaj, że nie ma pola ani właściwości generowania, a jedynie
Metoda
WorkInfo.getGeneration()
.
- Pamiętaj, że nie ma pola ani właściwości generowania, a jedynie
Metoda
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()