gpt4 book ai didi

android - 如何观察 Android WorkManager Worker

转载 作者:行者123 更新时间:2023-12-04 10:48:48 26 4
gpt4 key购买 nike

我目前的 Android 应用程序使用

archWorkerRuntimeVersion = '2.3.0-beta02'

api "androidx.work:work-runtime:$archWorkerRuntimeVersion"
api "androidx.work:work-runtime-ktx:$archWorkerRuntimeVersion"

处理后台工作。

在工作人员运行时,我会显示一个工具栏进度微调器,以向我的用户发出应用程序“忙碌”的信号。

我的应用程序由多个 Activity 组成,我使用 Android JetPack ViewModels 来管理 Worker。

我开始工作如下:-
val myWorkRequest: OneTimeWorkRequest =
OneTimeWorkRequest.Builder(MyWorker::class.java)
.addTag(WORK_IN_PROGRESS_TAG + "${UUID.randomUUID()}").build()

WorkManager.getInstance(applicationContext)
.beginUniqueWork(
UNIQUE_WORK_NAME,
ExistingWorkPolicy.KEEP,
myWorkRequest
)
.enqueue()

我有一个观察者定义如下:-
private val observer = Observer<WorkInfo> { workInfo ->

when(workInfo.state) {
WorkInfo.State.RUNNING -> Log.e("OBSERVING", "${UUID.randomUUID()} :: show Progress Spinner")
WorkInfo.State.ENQUEUED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: show Progress Spinner")
WorkInfo.State.SUCCEEDED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: stop showing Progress Spinner")
WorkInfo.State.FAILED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: stop showing Progress Spinner")
WorkInfo.State.BLOCKED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: show Progress Spinner")
WorkInfo.State.CANCELLED -> Log.e("OBSERVING", "${UUID.randomUUID()} :: stop showing Progress Spinner")
}

}

我观察工作如下:-
 WorkManager.getInstance(applicationContext)
.getWorkInfoByIdLiveData(myWorkRequest.id)
.observe(lifeCycleOwner, observer)

并记住我的 View 模型中的当前 workId
class MyViewModel : ViewModel() {

private var currentWorkInfoId: UUID? = null


fun startWorkTags(lifeCycleOwner: LifecycleOwner, applicationContext: Context) {

val myWorkRequest: OneTimeWorkRequest =
OneTimeWorkRequest.Builder(MyWorker::class.java)
.addTag(WORK_IN_PROGRESS_TAG + "${UUID.randomUUID()}").build()

WorkManager.getInstance(applicationContext)
.beginUniqueWork(
UNIQUE_WORK_NAME,
ExistingWorkPolicy.KEEP,
myWorkRequest
)
.enqueue()

currentWorkInfoId = myWorkRequest.id
}
}

我有以下问题

1)。因为我正在使用 ExistingWorkPolicy.KEEP ,我需要知道何时已经有后台工作处于 Activity 状态,以便我不记得错误的工作 ID。目前我无条件地记得我尝试使用的最后一个工作 ID enqueue() .有什么方法可以检测到 ExistingWorkPolicy.KEEP结果没有开始新的工作?

2)。当我在用户退出我的应用程序时将当前工作 ID 存储在我的 viewModel 中时,我丢失了这个 ID。当我的用户重新进入我的应用程序时,如何发现我是否有活跃的工作人员?

对于问题 2)。我试过使用
 WorkManager.getInstance(applicationContext)
.getWorkInfosForUniqueWorkLiveData(UNIQUE_WORK_NAME)
.observe(lifeCycleOwner, observerUnique)

然而,这种方法“看到”了所有以前的工作人员执行,我如何识别最新的工作人员实例?

最佳答案

鉴于您只想在 Worker 运行时显示进度微调器,您可以实现一个更简单的解决方案,您的观察者只需检查 non-final state 中是否有一个 Worker。 .

observe(this, listOfWorkInfo -> {
// If there are no matching work info, do nothing
if (listOfWorkInfo == null || listOfWorkInfo.isEmpty()) {
return;
}

boolean showProgress = false;
for (WorkInfo workInfo : listOfWorkInfo) {
if (!(workInfo.getState().isFinished())) {
showProgress = true;
}
}

if (showProgress) {
showSpinner();
} else {
hideSpinner();
}

}

在哪里可以通过 getWorkInfosForUniqueWorkLiveData() 获得 WorkInfos 列表.

另一种解决方案是使用新的 Progress API introduced in WorkManager v2.3.0你已经在使用的。

这个想法是在您的工作人员启动后立即发布进度(在构造函数中):
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, 1).build());
}

@NonNull
@Override
public Result doWork() {
try {
// Doing work.
Thread.sleep(DELAY);
} catch (InterruptedException exception) {
// ... handle exception
}
return Result.success();
}
}

您可以使用 workInfo.getProgress() 在已有的观察者中检索进度.这种情况下的好处来自这样一个事实,即只有在工作程序运行时才能获得进度信息。
您仍然可以从 UniqueWorkName 请求所有 WorkInfo,但只有在工作程序正在运行时才会有进度。

当工作器处于最终状态时,WorkManager 将负责删除进度信息。

关于android - 如何观察 Android WorkManager Worker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59577708/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com