android 显示进度,观察工作器的中间进度

WorkManager 2.3.0-alpha01 为设置和观察工作器的中间进度添加了一流的支持。如果应用在前台运行时,工作器保持运行状态,那么也可以使用返回 WorkInfo 的 LiveData 的 API 向用户显示此信息。

ListenableWorker 现在支持 setProgressAsync() API,此类 API 允许保留中间进度。借助这些 API,开发者能够设置可通过界面观察到的中间进度。进度由 Data 类型表示,这是一个可序列化的属性容器(类似于 input 和 output,并且受到相同的限制)。

只有在 ListenableWorker 运行时才能观察到和更新进度信息。如果尝试在 ListenableWorker 完成执行后在其中设置进度,则将会被忽略。您还可以使用 getWorkInfoBy…() 或 getWorkInfoBy…LiveData() 方法来观察进度信息。这两个方法会返回 WorkInfo 的实例,后者有一个返回 Data 的新 getProgress() 方法。

更新进度

对于使用 ListenableWorker 或 Worker 的 Java 开发者,setProgressAsync() API 会返回 ListenableFuture;更新进度是异步过程,因为更新过程涉及将进度信息存储在数据库中。在 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();

}

}

观察进度

以下是使用 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() {

@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 对象,请阅读工作状态和观察工作。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值