觀察 worker 中繼進度

WorkManager 提供設定及觀測中間層的一流支援 工作站的進度如果 worker 在 前景,也可使用 API 向使用者顯示這項資訊 會傳回 LiveData WorkInfo

ListenableWorker 現在支援 setProgressAsync() API,可使其保留中階進度。這些 API 可讓開發人員設定使用者介面可察看的中階進度。系統會以 Data 類型表示進度,其為屬性的可序列化容器 (類似於 inputoutput,並且受到相同的限制)。

只有在 ListenableWorker 執行期間,才能查看及更新進度資訊。嘗試在 ListenableWorker 上設定進度,且執行作業完成後就會被忽略。您也可以使用 getWorkInfoBy…()getWorkInfoBy…LiveData() 方式察看進度資訊。這些方法會回傳 WorkInfo 的執行個體,而新的 getProgress() 方法會回傳 Data

更新進度

針對使用 ListenableWorkerWorker 的 Java 開發人員,setProgressAsync() API 會回傳 ListenableFuture<Void>;更新進度並非同步,因為更新程序需要將進度資訊儲存在資料庫中。在 Kotlin 中,您可以使用 CoroutineWorker 物件的 setProgress() 擴充功能函式來更新進度資訊。

此範例顯示簡單的 ProgressWorkerWorker 會在開始時將進度設為 0,完成時則將進度值更新為 100。

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

查看進度

查看進度資訊也很簡單。您可以使用 getWorkInfoBy…()getWorkInfoBy…LiveData() 方式,並取得 WorkInfo 的參考資料。

下列為使用 getWorkInfoByIdLiveData API 的範例。

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 物件,請參閱「作業狀態和查看作業」。