使用Work Manager API每秒执行一次任务

Chi*_*orn 12 android background-process background-service kotlin android-workmanager

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

这是我的工人班

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

这就是我所说的.

 val recurringWork: PeriodicWorkRequest = PeriodicWorkRequest.Builder(TestingWorker::class.java, 1, TimeUnit.SECONDS).build()
 WorkManager.getInstance()?.enqueue(recurringWork)
Run Code Online (Sandbox Code Playgroud)

Sag*_*gar 29

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

根据文档:

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

我建议你不要经常安排工作.这将最终消耗更多资源并最终影响电池寿命.

  • 我知道了。无论如何,它应该显示为警告消息,让我们知道。 (3认同)
  • 我已经检查了源代码,并发现以下问题:public void setPeriodic(long intervalDuration){if(intervalDuration <MIN_PERIODIC_INTERVAL_MILLIS){Log.w(TAG,String.format(“间隔持续时间小于最小允许值;已更改为% s“,MIN_PERIODIC_INTERVAL_MILLIS));intervalDuration = MIN_PERIODIC_INTERVAL_MILLIS; } setPeriodic(intervalDuration,intervalDuration); }因此,我们不能少于1500万。多谢兄弟。 (2认同)
  • 好的哥们儿。您的答案现在可以接受了。 (2认同)

Tal*_*aid 13

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

setInitialDelay(5, TimeUnit.MINUTES)
Run Code Online (Sandbox Code Playgroud)

例如

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();
    }
}

Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

WorkManager 将排队工作请求将调用相应的 Worker 类来运行任务,其中每个 Worker 类覆盖doWork()定义实际任务的位置。

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

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

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


小智 8

现在得到答案已经太晚了,但是工作管理器可以在定期请求之间安排至少 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()
}
Run Code Online (Sandbox Code Playgroud)

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