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

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 yoksayılır.

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 İlerleme 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 gözlemleme

İ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
             }
      }
});

Worker nesneleri gözlemleme hakkında daha fazla doküman için Çalışma durumları ve çalışmayı gözlemleme başlıklı makaleyi inceleyin. Çalışma beklenmedik bir şekilde sonlandırıldığında stopReason'ı nasıl alacağınızı öğrenmek için Durdurma nedeni durumunu gözlemleme başlıklı makaleyi inceleyin.