WorkManager 提供設定及觀測中間層的一流支援
工作站的進度如果 worker 在
前景,也可使用 API 向使用者顯示這項資訊
會傳回 LiveData
WorkInfo
。
ListenableWorker
現在支援 setProgressAsync()
API,可使其保留中階進度。這些 API 可讓開發人員設定使用者介面可察看的中階進度。系統會以 Data
類型表示進度,其為屬性的可序列化容器 (類似於 input
和 output
,並且受到相同的限制)。
只有在 ListenableWorker
執行期間,才能查看及更新進度資訊。嘗試在 ListenableWorker
上設定進度,且執行作業完成後就會被忽略。您也可以使用 getWorkInfoBy…()
或 getWorkInfoBy…LiveData()
方式察看進度資訊。這些方法會回傳 WorkInfo
的執行個體,而新的 getProgress()
方法會回傳 Data
。
更新進度
針對使用 ListenableWorker
或 Worker
的 Java 開發人員,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
物件,請參閱「作業狀態和查看作業」。