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

WorkManager, orta düzeyde ayarlamak ve gözlemlemek için birinci sınıf desteğe sahiptir ne ifade ettiğine bakacağız. Çalışan, uygulama etkinken çalışıyorsa Bu bilgiler, kullanıcıya gösterilebilecek API'ler aracılığıyla da şunu döndür: LiveData WorkInfo.

ListenableWorker artık şunları destekliyor: setProgressAsync() API. Bu API'ler, geliştiricilerin kullanıcı arayüzünde gözlemlenebilecek ara ilerlemeler belirlemesini sağlayın. İlerleme durumu Data türüyle gösterilir. Bunlar, seri dönüştürülebilir bir mülkler kapsayıcısıdır (input ve output, ve aynı kısıtlamalara tabidir).

İlerleme bilgileri yalnızca ListenableWorker çalışıyor. ListenableWorker cihazında ilerleme durumunu ayarlama denemeleri tamamlandıktan sonra yoksayılır. İlerleme durumunu getWorkInfoBy…() veya getWorkInfoBy…LiveData() yöntemlerine göz atın. Bu yöntemler, WorkInfo (yeni bir getProgress() yöntem şu sonucu döndürür: Data.

Güncelleme İlerleme Durumu

ListenableWorker kullanan Java geliştiricileri için veya Worker setProgressAsync() API bir ListenableFuture<Void> döndürür; eşzamansız bir güncellemeyle, Çünkü güncelleme süreci, ilerlemeyle ilgili bilgilerin bir veritabanında depolanmasını içerir. Kotlin'de, CoroutineWorker nesnenin setProgress() uzantı işlevini kullanabilirsiniz.

Bu örnekte basit bir ProgressWorker gösterilmektedir. Worker ilerleme durumunu şu şekilde ayarlıyor: 0 olarak günceller. İşlem tamamlandığında ise ilerleme değeri 100 olarak güncellenir.

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. URL parametrelerinin Google tarafından nasıl ele alınmasını istediğinizi belirtmek için getWorkInfoBy…() veya getWorkInfoBy…LiveData() yöntemleri ve WorkInfo referansı alın.

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

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 nesneleri gözlemleme hakkında daha fazla doküman için Çalışma Durumları ve işi gözlemleme.