24

工作管理器是一个新的 API,我尝试每秒执行一次任务,但它不起作用。

这是我的工人阶级

class TestingWorker : Worker(){
    override fun doWork(): Result {
        Log.i("CheckWorker","Result here")
        return Result.SUCCESS
    }
}

这就是我所说的。

 val recurringWork: PeriodicWorkRequest = PeriodicWorkRequest.Builder(TestingWorker::class.java, 1, TimeUnit.SECONDS).build()
 WorkManager.getInstance()?.enqueue(recurringWork)
4

4 回答 4

45

它不起作用,因为两个定期工作请求之间的最小间隔是 15 分钟,由MIN_PERIODIC_INTERVAL_MILLIS定义。

根据文档

创建一个 PeriodicWorkRequest 以在每个间隔期间定期运行一次。PeriodicWorkRequest 保证在此时间间隔内只运行一次。intervalMillis 必须大于或等于 PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS。只要当时满足其他条件,它就可以立即运行,也可以在周期结束时运行,也可以在两者之间的任何时间运行。

我建议您避免如此频繁地安排工作。这最终会消耗更多资源并最终影响电池寿命。

于 2018-07-06T05:56:39.573 回答
8

WorkManager 并非设计为每秒运行任务,因为它有两个选项来构建工作请求,即

  • PeriodicWorkRequest- 每 15 分钟运行一次重复任务,即使我们将时间间隔更改为 anyhwere < 15 分钟,默认情况下它只会运行 15 分钟。
  • OneTimeWorkRequest- 运行一次

WorkManager 会将 workrequest 排入队列,将调用各自的 Worker 类来运行任务,其中每个 Worker 类将覆盖doWork()定义实际任务的位置。

此方法在后台线程中运行并运行 10 分钟,然后工作人员停止。

因此,如果您想更好地安排每秒运行的任务,请使用运行前台服务,或者如果您在短时间内运行任务。

如果您想长时间运行后台任务,最佳做法是避免它。

于 2019-08-26T13:57:28.333 回答
5

实现该行为的另一种方法是创建OneTimeWorkRequest和该工作人员请求,为您想要的间隔安排另一个初始延迟

setInitialDelay(5, TimeUnit.MINUTES)

例如

public class UploadWorker extends Worker {
    private final Context context;

    public UploadWorker(
            @NonNull Context context,
            @NonNull WorkerParameters params) {
        super(context, params);
        this.context = context;
    }

    @Override
    public Result doWork() {

        Log.i("tracer:", "Worker executed");
        // Indicate whether the work finished successfully with the Result
        OneTimeWorkRequest mywork = new OneTimeWorkRequest.Builder(UploadWorker.class)
                .setInitialDelay(5, TimeUnit.MINUTES)
                .build();
        WorkManager.getInstance(this.context).enqueue(mywork);
        return Result.success();
    }
}

于 2021-11-27T11:57:22.617 回答
4

答案已经太晚了,但是,工作经理可以在定期请求之间至少延迟 15 分钟的时间安排任务,但是如果您想实现定期工作,那么您可以使用下面给出的登录名来执行此操作不是一个好习惯,但它有效。

您可以将工作人员设置为 15 分钟请求的定期请求,该请求将定期工作,在工作人员类中,您可以按如下所示每秒管理您的工作人员。

override suspend fun doWork(): Result {
    for (i in 1..900){
        delay(1000)
        Log.d("Work for every second", "doWork: Running")
    }
    return Result.success()
}

这将每秒工作 15 分钟,15 分钟后,您的工作人员将再次提出请求,因此这就是您如何实现每秒工作的方式。您必须管理您的工作人员何时停止,否则这也会造成内存泄漏。这不是每秒钟都使用这种功能的最佳实践,但这就是您实现此目的的方法。

于 2021-11-15T07:19:10.633 回答