WorkManager, çalışanlar için ara ilerleme durumunu ayarlama ve gözlemleme konusunda yerleşik destek sunar. Çalışan, uygulama ön plandayken çalışıyorsa bu bilgiler, LiveData
WorkInfo
değerini döndüren API'ler kullanılarak kullanıcıya da gösterilebilir.
ListenableWorker
artık ara ilerlemenin kalıcı olmasına olanak tanıyan setProgressAsync()
API'sini destekliyor. Bu API'ler, geliştiricilerin kullanıcı arayüzü tarafından gözlemlenebilecek ara ilerleme durumu ayarlamasına olanak tanır.
İlerleme durumu, Data
türüyle gösterilir. Bu tür, özelliklerin seri hâle getirilebilir bir kapsayıcısıdır (input
ve output
'a benzer ve aynı kısıtlamalara tabidir).
İlerleme bilgileri yalnızca ListenableWorker
çalışırken gözlemlenebilir ve güncellenebilir. Yürütme işlemi tamamlandıktan sonra ListenableWorker
üzerinde ilerleme ayarlama girişimleri göz ardı edilir.
Ayrıca getWorkInfoBy…()
veya getWorkInfoBy…LiveData()
yöntemlerinden birini kullanarak ilerleme bilgilerini de gözlemleyebilirsiniz. Bu yöntemler, Data
değerini döndüren yeni bir getProgress()
yöntemine sahip olan WorkInfo
örneklerini döndürür.
Güncelleme ilerleme durumu
ListenableWorker
veya Worker
kullanan Java geliştiriciler için setProgressAsync()
API, ListenableFuture<Void>
değerini döndürür. Güncelleme işlemi, ilerleme bilgilerinin bir veritabanında depolanmasını içerdiğinden güncelleme ilerlemesi asenkron olarak gerçekleşir.
Kotlin'de ilerleme bilgilerini güncellemek için CoroutineWorker
nesnesinin setProgress()
uzantı işlevini kullanabilirsiniz.
Bu örnekte ProgressWorker
gösterilmektedir. Worker
başladığında ilerleme durumunu 0 olarak ayarlar ve tamamlandığında ilerleme değerini 100 olarak günceller.
Kotlin
import android.content.Context
import androidx.work.CoroutineWorker
import androidx.work.Data
import androidx.work.WorkerParameters
import kotlinx.coroutines.delay
class ProgressWorker(context: Context, parameters: WorkerParameters) :
CoroutineWorker(context, parameters) {
companion object {
const val Progress = "Progress"
private const val delayDuration = 1L
}
override suspend fun doWork(): Result {
val firstUpdate = workDataOf(Progress to 0)
val lastUpdate = workDataOf(Progress to 100)
setProgress(firstUpdate)
delay(delayDuration)
setProgress(lastUpdate)
return Result.success()
}
}
Java
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.work.Data;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
public class ProgressWorker extends Worker {
private static final String PROGRESS = "PROGRESS";
private static final long DELAY = 1000L;
public ProgressWorker(
@NonNull Context context,
@NonNull WorkerParameters parameters) {
super(context, parameters);
// Set initial progress to 0
setProgressAsync(new Data.Builder().putInt(PROGRESS, 0).build());
}
@NonNull
@Override
public Result doWork() {
try {
// Doing work.
Thread.sleep(DELAY);
} catch (InterruptedException exception) {
// ... handle exception
}
// Set progress to 100 after you are done doing your work.
setProgressAsync(new Data.Builder().putInt(PROGRESS, 100).build());
return Result.success();
}
}
İlerleme durumunu takip etme
İlerleme bilgilerini gözlemlemek için getWorkInfoById
yöntemlerini kullanın ve WorkInfo
ile ilgili referans alın.
Kotlin için getWorkInfoByIdFlow
, Java için getWorkInfoByIdLiveData
kullanılan bir örneği burada bulabilirsiniz.
Kotlin
WorkManager.getInstance(applicationContext)
// requestId is the WorkRequest id
.getWorkInfoByIdFlow(requestId)
.collect { workInfo: WorkInfo? ->
if (workInfo != null) {
val progress = workInfo.progress
val value = progress.getInt("Progress", 0)
// Do something with progress information
}
}
Java
WorkManager.getInstance(getApplicationContext())
// requestId is the WorkRequest id
.getWorkInfoByIdLiveData(requestId)
.observe(lifecycleOwner, new Observer<WorkInfo>() {
@Override
public void onChanged(@Nullable WorkInfo workInfo) {
if (workInfo != null) {
Data progress = workInfo.getProgress();
int value = progress.getInt(PROGRESS, 0)
// Do something with progress
}
}
});
Durdurma nedeni durumunu gözlemleme
Worker
öğesinin neden durdurulduğunu ayıklamak için WorkInfo.getStopReason()
işlevini çağırarak durdurma nedenini günlüğe kaydedebilirsiniz:
Kotlin
workManager.getWorkInfoByIdFlow(syncWorker.id)
.collect { workInfo ->
if (workInfo != null) {
val stopReason = workInfo.stopReason
logStopReason(syncWorker.id, stopReason)
}
}
Java
workManager.getWorkInfoByIdLiveData(syncWorker.id)
.observe(getViewLifecycleOwner(), workInfo -> {
if (workInfo != null) {
int stopReason = workInfo.getStopReason();
logStopReason(syncWorker.id, workInfo.getStopReason());
}
});
Worker
nesnelerinin yaşam döngüsü ve durumları hakkında daha fazla doküman için Çalışma durumları başlıklı makaleyi inceleyin.