android 是否可以对PeriodicWorkRequest上的任务设置优先级?

92vpleto  于 2023-02-02  发布在  Android
关注(0)|答案(1)|浏览(163)

我们利用一个定期工人每15分钟获取一次位置。只要手机被积极使用,互联网连接可用,一切都按书进行。
但是,当应用程序在后台停留太长时间,甚至更糟的是,当它处于飞行模式时,获取之间的间隔会长达几个小时。
我相信这是因为工作是批量的,由Android手机决定何时再次运行。
根据文档,setExpedited()实际上可以在更高的紧急程度下运行作业,并防止它被批处理。
将工作请求标记为对用户重要。在这种情况下,WorkManager向操作系统提供附加信号,表明此工作很重要。

val workRequest = PeriodicWorkRequestBuilder<WappWorker>(15, TimeUnit.MINUTES).addTag(
                TAG
            ).setExpedited(OutOfQuotaPolicy.RUN_AS_NON_EXPEDITED_WORK_REQUEST).build()

我已经用这种方法实现了它,并且成功地编译和运行了它,但是它在运行时崩溃了:
java. lang.非法参数异常:无法加速处理定期工作请求
多奇怪啊。所以这个功能似乎只允许OneTimeWorker使用,而不允许PeriodicWorker使用。
我有哪些选项?是否有其他方法可以将我的定期工作者作业标记为更高的紧急程度?谢谢

nbnkbykc

nbnkbykc1#

你可以试试这个:

class MyWorker(appContext: Context, workerParams: WorkerParameters) : Worker(appContext, workerParams) {
    override fun doWork(): Result {
        // Do the work here

        // Return a Result indicating whether the work succeeded or failed
        return Result.success()
    }
}

// Create a Constraints object to specify the conditions for the work to run
val constraints = Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .build()

// Create a Data object to pass data to the worker
val data = Data.Builder()
    .putString("key", "value")
    .build()

// Create a OneTimeWorkRequest to run the work
val workRequest = OneTimeWorkRequestBuilder<MyWorker>()
    .setConstraints(constraints)
    .setInputData(data)
    .build()

// Enqueue the work
WorkManager.getInstance(context).enqueue(workRequest)

在本例中,我们创建了一个名为MyWorker的自定义辅助类,它扩展了Worker类。doWork方法是完成工作的地方。在此方法中,您可以执行希望辅助执行的任务。
我们还创建了一个Constraints对象来指定工作运行的条件,例如所需的网络类型,我们创建了一个Data对象来将数据传递给工作进程,并创建了一个OneTimeWorkRequest来运行工作。
最后,我们使用WorkManager. enqueue方法将工作入队,当满足Constraints对象中指定的条件时,工作将在后台运行。

相关问题