Ara çalışanların ilerleme durumunu gözlemleme

WorkManager, çalışanlar için orta seviye ilerlemeyi ayarlama ve gözlemleme konusunda birinci sınıf desteğe sahiptir. Çalışan, uygulama ön plandayken çalışıyorsa bu bilgiler WorkInfo öğesinin LiveData değerini döndüren API'ler kullanılarak da kullanıcıya gösterilebilir.

ListenableWorker artık setProgressAsync() API'yi desteklemektedir. Bu API, aradaki ilerlemeyi sürdürmesine olanak tanır. Bu API'ler, geliştiricilerin, kullanıcı arayüzü tarafından gözlemlenebilecek ara ilerleme durumlarını ayarlamasına olanak tanır. İlerleme durumu, seri hale getirilebilen bir özellikler kapsayıcısı olan (input ve output'e benzer ve aynı kısıtlamalara tabidir) Data türüyle temsil edilir.

İlerleme durumu bilgileri yalnızca ListenableWorker çalışırken gözlemlenebilir ve güncellenebilir. Yürütme işlemini tamamladıktan sonra ListenableWorker üzerinde ilerleme durumunu ayarlama denemeleri yok sayılır. Ayrıca, getWorkInfoBy…() veya getWorkInfoBy…LiveData() yöntemlerinden birini kullanarak ilerleme bilgilerini gözlemleyebilirsiniz. Bu yöntemler, Data değerini döndüren yeni bir getProgress() yöntemine sahip WorkInfo örneklerini döndürür.

Güncelleme İlerleme Durumu

ListenableWorker veya Worker kullanan Java geliştiricileri için setProgressAsync() API bir ListenableFuture<Void> döndürür. Güncelleme işleminin ilerleme durumu bilgilerinin bir veritabanında depolanması nedeniyle, güncelleme ilerlemesi eşzamansız olarak yapılır. Kotlin'de, ilerleme durumunu güncellemek için CoroutineWorker nesnesinin setProgress() uzantı işlevini kullanabilirsiniz.

Bu örnekte basit bir ProgressWorker gösterilmektedir. Worker, başladığında ilerleme durumunu 0 olarak ayarlar ve tamamlandıktan sonra 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();
    }
}

İlerlemeyi Gözlemleme

İlerleme bilgilerini gözlemlemek de basittir. getWorkInfoBy…() veya getWorkInfoBy…LiveData() yöntemlerini kullanabilir ve WorkInfo referansı alabilirsiniz.

getWorkInfoByIdLiveData API'nin kullanıldığı bir örneği aşağıda görebilirsiniz.

Kotlin

WorkManager.getInstance(applicationContext)
    // requestId is the WorkRequest id
    .getWorkInfoByIdLiveData(requestId)
    .observe(observer, Observer { 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
             }
      }
});

Worker nesnelerini gözlemleme hakkında daha fazla belge için Çalışma durumlarını ve çalışmaları gözlemleme bölümünü okuyun.