使用 enqueueUniquePeriodicWork 排队的辅助角色类停止工作

Worker class enqueued with enqueueUniquePeriodicWork stops working

提问人:Yossi Dahan 提问时间:11/14/2023 更新时间:11/18/2023 访问量:27

问:

赏金将在 4 天后到期。这个问题的答案有资格获得 +100 声望赏金。Yossi Dahan希望引起人们对这个问题的更多关注
任何有助于理解/解决问题的见解

我有一个 Worker 类 - 我使用它排队public class UpdatePushRegistration extends Worker

PeriodicWorkRequest myWorkRequest = new PeriodicWorkRequest.Builder(UpdatePushRegistration.class, 20, TimeUnit.MINUTES)
.build();

WorkManager.getInstance(getApplicationContext()).enqueueUniquePeriodicWork("UpdatePushNotification", ExistingPeriodicWorkPolicy.CANCEL_AND_REENQUEUE,myWorkRequest);

当我在调试器中运行并让我的笔记本电脑运行时,它似乎工作正常。当我在手机上运行时(通过复制 APK 或通过商店发布),它会运行多次,有时低至 2 次,然后停止(我写入基于云的日志)。我在两种不同的手机型号上尝试了这个。

知道为什么会停止或如何排除故障吗?

java 安卓

评论

0赞 Furkan Yurdakul 11/24/2023
这可能取决于手机型号/品牌。如果您使用的是小米、华为、OPPO 等任何一款......系统可能会在一段时间后阻止工作线程以优化电池。每个设备都有其独特的解决方案:例如,在小米中,您可以禁用省电模式选项。否则,除非手机制造商默认明确允许您的应用程序,否则无法保证。

答:

1赞 Zain 11/18/2023 #1

知道为什么会停止或如何排除故障吗?

可能是因为它是一个长时间运行的工作程序,在这种情况下,文档为长时间运行的工作程序提供支持,该工作线程代表您运行前台服务以执行 .WorkRequest

这需要调用 startForeground() 来更新与前台服务关联的通知:

这些 API 允许开发人员指定此 WorkRequest 是 重要(从用户角度来看)或长时间运行。

该文档提供了该案例的 Java 示例而这个答案还有另一个 Kotlin 的例子。