WorkManager には、ワーカーの中間進捗状況の設定および監視に関する最高クラスのサポートがあります。アプリがフォアグラウンドで実行されているときにワーカーが実行されていた場合、この情報も、WorkInfo
の LiveData
を返す API を使用して、ユーザーに表示できます。
ListenableWorker
が中間進捗状況を保持可能な setProgressAsync()
API をサポートするようになりました。デベロッパーはこの API を使用して、UI で監視可能な中間進捗状況を設定できます。進捗状況は、プロパティのシリアル化可能なコンテナ(input
および output
に似ており、同じ制限を受ける)である Data
型で表されます。
進捗状況情報を監視および更新できるのは、ListenableWorker
が実行されている間だけです。ListenableWorker
の実行完了後にその進捗状況を設定しようとしても無視されます。進捗状況情報は、getWorkInfoBy…()
または getWorkInfoBy…LiveData()
のいずれかのメソッドを使用して監視することも可能です。これらのメソッドは、Data
を返す新しい getProgress()
メソッドを持つ WorkInfo
のインスタンスを返します。
更新状況
Java で ListenableWorker
または Worker
を使用している場合、setProgressAsync()
API は ListenableFuture<Void>
を返します。更新プロセスで進捗状況情報をデータベースに保存する場合、進捗状況の更新は非同期で行われます。Kotlin では、CoroutineWorker
オブジェクトの setProgress()
拡張関数を使用して進捗状況情報を更新できます。
以下に、シンプルな ProgressWorker
の例を示します。Worker
は開始時に進捗状況の値を 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
オブジェクトの監視方法について詳しくは、処理の状態と処理のモニタリングをご覧ください。