gpt4 book ai didi

android - 升级到 WorkManager 2.7.0 : How to implement getForegroundInfoAsync for RxWorker?

转载 作者:行者123 更新时间:2023-12-05 00:13:04 47 4
gpt4 key购买 nike

我的应用程序的目标是 API 31/Android 12,根据 Google 需要 WorkManager 版本 2.7.0 ,所以为了做到这一点,我添加了 setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST)给我的OneTimeWorkRequestBuilder并在 AndroidManifest 中添加了必要的更改(详见 link)。但是,当我运行我的应用程序时,我遇到了这个错误:

java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Expedited WorkRequests require a ListenableWorker to provide an implementation for `getForegroundInfoAsync()`
Google 没有提供关于如何为 RxWorker 执行此操作的示例或文档,但我发现了 answer在 Stackoverflow 中,但它适用于协程。
我的问题是你如何实现所说的 getForegroundInfoAsync对于 RxWorkergetForegroundInfoAsync必须返回 ListenableFuture<ForegroundInfo> --阅读文档似乎我必须将 Guava 添加到我的应用程序中才能做到这一点?由于 ListenableFuture 的文档对 Avoid implementing ListenableFuture from scratch. If you can't get by with the standard implementations, prefer to derive a new Future instance with the methods in Futures or, if necessary, to extend AbstractFuture.

最佳答案

编辑:目前,有两种方法可以解决这个问题:
1. 使用受限 API
查看 ListenableWorker 的源代码,我们找到了 getForegroundInfoAsync :

    @NonNull
public ListenableFuture<ForegroundInfo> getForegroundInfoAsync() {
SettableFuture<ForegroundInfo> future = SettableFuture.create();
String message =
"Expedited WorkRequests require a ListenableWorker to provide an implementation for"
+ " `getForegroundInfoAsync()`";
future.setException(new IllegalStateException(message));
return future;
}
所以在我自己的 RxWorker 的 getForegroundInfoAsync 实现中,我尝试创建一个 SettableFuture但我看到一个 lint 警告告诉我 SettableFuture 的用法被限制在其图书馆内。但这可以通过仅注释实现 getForegroundInfoAsync 来绕过。与 @SuppressLint("RestrictedApi") .这是我的代码大致如下所示:
    @SuppressLint("RestrictedApi")
override fun getForegroundInfoAsync(): ListenableFuture<ForegroundInfo> {
val future = SettableFuture.create<ForegroundInfo>()

val notificationId = id.hashCode()
val fileName = inputData.getString(KEY_OUTPUT_FILE_NAME)

if (fileName == null) {
future.setException(IllegalStateException("Filename is null"))
return future
}

val notificationBuilder = getNotificationBuilder(fileName)

future.set(ForegroundInfo(notificationId, notificationBuilder.build()))
return future
}
2. 使用 CallbackToFutureAdapter
您可以使用 CallbackToFutureAdapter,而不是依赖受限 API ,但此解决方案需要 Futures AndroidX 库,请参阅链接 here .将上述库添加到您的项目后,您可以使用 CallbackToFutureAdapter以这种方式返回 ListenableFuture:
override fun getForegroundInfoAsync(): ListenableFuture<ForegroundInfo> {
val fileName = inputData.getString(KEY_OUTPUT_FILE_NAME)

return CallbackToFutureAdapter.getFuture {
if (fileName == null) {
it.setException(IllegalStateException("Filename is null"))
} else {
notificationBuilder = getNotificationBuilder(fileName)

it.set(ForegroundInfo(notificationId, notificationBuilder.build()))
}
}
}
但是,在创建 PendingIntent 时有一个警告。对于您的通知,不要忘记拥有 PendingIntent.FLAG_MUTABLE标志集(详见 answer)

关于android - 升级到 WorkManager 2.7.0 : How to implement getForegroundInfoAsync for RxWorker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69684656/

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