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.只要当时满足其他条件,它可以立即运行,在期间结束时或之间的任何时间运行.
我建议你不要经常安排工作.这将最终消耗更多资源并最终影响电池寿命.
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 分钟后,您的工作人员将再次发出请求,因此这就是您每秒完成工作的方法。您必须管理您的工作人员何时停止,否则这也会造成内存泄漏。这并不是每秒都使用此类功能的最佳实践,但这是实现此目的的方法。
归档时间: |
|
查看次数: |
5131 次 |
最近记录: |