- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在与 AndroidX Work Dependency 合作尝试运行一些后台服务操作。截至发布此问题时,我当前正在运行最新的稳定版本 2.2.0
。
我在后台运行的实际操作是一项相当重的 CPU 操作,因为它在我的一个库 ( here ) 中使用一些压缩代码,并且可能需要 3-30 分钟,具体取决于大小和相关视频的长度。
这是我构建和运行工作请求的代码:
public static void startService(){
//Create the Work Request
String uniqueTag = "Tag_" + new Date().getTime() + "_ChainVids";
OneTimeWorkRequest.Builder builder = new OneTimeWorkRequest.Builder(CompleteVideoBackgroundService.class);
Constraints.Builder constraints = new Constraints.Builder();
constraints.setRequiredNetworkType(NetworkType.CONNECTED);
builder.setConstraints(constraints.build());
builder.setInitialDelay(1, TimeUnit.MILLISECONDS);
builder.addTag(uniqueTag);
Data inputData = new Data.Builder().putString("some_key", mySerializedJSONString).build();
builder.setInputData(inputData);
OneTimeWorkRequest compressRequest = builder.build();
//Set the Work Request to run
WorkManager.getInstance(MyApplication.getContext())
.beginWith(compressRequest)
.enqueue();
}
然后它会触发运行所有后台服务操作的此类:
public class MyServiceSampleForStackoverflow extends Worker {
private Context context;
private WorkerParameters params;
public MyServiceSampleForStackoverflow(@NonNull Context context, @NonNull WorkerParameters params){
super(context, params);
this.context = context;
this.params = params;
}
/**
* Trimming this code down considerably, but the gist is still here
*/
@NonNull
@Override
public Result doWork() {
try {
//Using using a hard-coded 50% for this SO sample
float percentToBringDownTo = 0.5F;
Uri videoUriToCompress = MyCustomCode.getVideoUriToCompress();
VideoConversionProgressListener listener = (progressPercentage, estimatedNumberOfMillisecondsLeft) -> {
float percentComplete = (100 * progressPercentage);
//Using this value to update the Notification Bar as well as printing in the logcat. Erroneous code removed
};
String newFilePath = MyCustomCode.generateNewFilePath();
//The line below this is the one that takes a while as it is running a long operation
String compressedFilePath = SiliCompressor.with(MyApplication.getContext()).compressVideo(
listener, videoUriToCompress.getPath(), newFilePath, percentToBringDownTo);
//Do stuff here with the compressedFilePath as it is now done
return Result.success();
} catch (Exception e){
e.printStackTrace();
return Result.failure();
}
}
}
偶尔,没有任何规律或理由,工作人员会在没有我告诉它的情况下随机停止。发生这种情况时,我会看到以下错误:
Work [ id=254ae962-114e-4088-86ec-93a3484f948d, tags={ Tag_1571246190190_ChainVids, myapp.packagename.services.MyServiceSampleForStackoverflow } ] was cancelled
java.util.concurrent.CancellationException: Task was cancelled.
at androidx.work.impl.utils.futures.AbstractFuture.cancellationExceptionWithCause(AbstractFuture.java:1184)
at androidx.work.impl.utils.futures.AbstractFuture.getDoneValue(AbstractFuture.java:514)
at androidx.work.impl.utils.futures.AbstractFuture.get(AbstractFuture.java:475)
at androidx.work.impl.WorkerWrapper$2.run(WorkerWrapper.java:284)
at androidx.work.impl.utils.SerialExecutor$Task.run(SerialExecutor.java:91)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
当这种情况随机发生时,我实际上只是盯着我的手机,根本不与它互动。我不想运行其他应用程序,也不想占用 CPU 做其他事情。我从来没有看到自己的任何堆栈跟踪,也没有明显的直接问题或原因。
因此,问题是,这里发生了什么,在没有任何挑衅的情况下随机停止 Worker 服务? 为什么会随机停止操作?
谢谢大家。
编辑 1
我确实测试了删除网络约束要求线,认为这可能会导致问题,并且我确实看到它甚至在那之后发生,所以我不认为这就是问题。
我正在 Google Pixel 3、API 28、Android 9 上进行测试,但我测试过的任何其他设备(无论 API 级别如何(最低支持为 21))都显示了相同的问题。
编辑 2
ListenableWorker
而不是 Worker
来重写该类以使用异步方法,但这并没有解决问题。 最佳答案
您很可能面临以下两个问题之一。
首先,假设您的后台服务运行时间超过 10 分钟可能需要 3-30 分钟,具体取决于相关视频的大小和长度
,您可以遇到由 WorkManager 代码强加的硬时间限制。
在 docs here他们说:系统指示您的应用程序出于某种原因停止您的工作。如果超过 10 分钟的执行期限,就会发生这种情况。
这似乎是最有可能的,但另一个问题可能与概述的 Android 后台限制有关 here其中详细介绍了与面向 Android 8.0 或更高版本的应用
相关的更改。正如您在编辑中提到的,您正在 Google Pixel 3、API 28、Android 9
上进行测试,这可能是直接相关的。
就解决方案而言,最简单的解决方案(尽管是一个令人沮丧的解决方案)是告诉用户他们需要将应用程序保持在前台。这至少可以避免 10 分钟的间隙。
另一种选择是利用 API 29 中引入的新 Bubble API。文档为 here您可能感兴趣的文档部分是这样的:当气泡展开时,内容 Activity 会经历正常的进程生命周期,导致应用程序成为前台进程
。制作一个小型化的“扩展” View 并在应用程序关闭时由用户扩展该 View 是绕过 10 分钟计时器的一个很好的替代解决方案。
关于java - AndroidX Work Library 正在取消操作,看似没有原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58419226/
我回到我的 Android 项目来完成它的工作,突然我收到此错误消息 “无法解析 androidxAffected 模块:app” “错误:无法解析:androidx。受影响的模块:应用程序” 这是我
我今天尝试使用 Android Studio 中的“重构 -> 迁移到 AndroidX”选项将我当前的项目迁移到 AndroidX,每当我尝试编译我的应用程序时,我都会收到一个 Program ty
当我尝试构建应用程序时,它在构建选项卡上给了我这个错误 More than one file was found with OS independent path 'META-INF/androidx
我在尝试构建 Android 应用程序时遇到以下问题。我遇到了一些关于强制或使用手动依赖项解决策略的 android 帖子。这似乎并没有解决问题。 有人问过类似的问题:Similar stack ov
我刚刚通过 Android Studio 菜单选项 Refactor -> Refactor to AndroidX 迁移到 androidx 我收到以下错误: android.view.Inflat
我用 kotlin 开始新的 android 应用程序项目。我的 sdk gradle 配置是 compileSdkVersion 29 和 buildToolsVersion "29.0.1" 我试
我迁移到 AndroidX,然后如果我尝试使用 API 29 将项目运行到模拟器中,我会收到错误。 API 28 及之前的模拟器/真实设备没有问题。 java.lang.RuntimeExceptio
我正在开发 Android MVVM 应用程序。我只是手动切换到 androidx 库。这是我的 build.gradle 中的库: implementation 'com.google.code.g
在迁移到 AndroidX 并将所有 AndriodX 包更新到最新版本后,构建将失败,在 obj 中的构建生成的 XML 文件中显示三个类似的错误文件夹: \obj\Debug\100\lp\117
从 更新导航组合依赖后2.4.0-alpha03 至 2.4.0-alpha05 在尝试在可组合屏幕之间导航(例如从 taskComposable 导航到 listComposable 屏幕)后,我遇
我刚刚通过 Android Studio 菜单选项 重构 -> 重构到 AndroidX 迁移到 androidx 我收到以下错误: android.view.InflateException: Bi
我创建了一个 Android 应用程序,并从 Gallery 添加了“Navigation Drawer Activity”,我删除并重命名了菜单项。当我单击抽屉 Activity 中的任何菜单项启动
我正在制作一个项目,但是当我编译我的项目并在 Android Studio 上启动应用程序时,我的应用程序崩溃了。 在我的 Logcat 错误中 Process: com.passionategeek
完整的堆栈仅包括 android 核心代码: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean and
将项目迁移到 AndroidX 后出现以下错误:程序类型已经存在androidx.concurrent.futures.DirectExecutor 我的应用Gradle如下: configu
我想在 Play 商店中更新应用程序的版本,但在测试中我开始收到此错误。 Superclass androidx.core.app.f of androidx.activity.ComponentAc
AndoirdX 升级后出现错误。 android.databinding.tool.util.LoggedErrorException: failure, see logs for details.
将项目迁移到 AndroidX 后我遇到了这个崩溃 Unable to start activity ComponentInfo{oackagename/com.paymob.acceptsdk.P
我的导航 Controller 中有此错误,我已经更改了 XML 中的声明,但没有帮助,我更改了 Fragment 为 FragmenContainer,但没有帮助。谁能帮我解决这个错误? 日志: E
我创建了一个水平回收器 View ,其中加载了项目。之后,我需要选择该项目并执行点击事件。到这个存档(代码在下面可用),现在我想改变点击项目的颜色,剩下的项目应该被取消选择。如果我没有正确查询,请道歉
我是一名优秀的程序员,十分优秀!