本文介绍了WorkManager OneTimeWorkRequest InitialDelay 在设置的时间后起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

更新(2019 年 11 月 21 日)

WorkManager.getInstance(activity).enqueueUniquePeriodicWork("test_work",现有的PeriodicWorkPolicy.KEEP,PeriodicWorkRequest.Builder(MyWorker::class.java,15、时间单位.MINUTES).建造())

现在我正在使用 PeriodicWork 并且现在 doWork() 调用了两次,即使我在第一次尝试时取消了 uniquettask.我收到了两次通知并且 检查日志也被调用了两次.

注意:它只发生第一次,有时第二次也会发生,但第三次不会发生两次.

override fun doWork(): 结果 {如果(检查任务完成()){Logger.e("checkXXX----Hurrayyyy ☻♥☺")val notificationUtils: NotificationUtils = NotificationUtils(applicationContext)notificationUtils.showNotificationMessage("Readddd", "rwaeaeae.", 2)WorkManager.getInstance(context).cancelUniqueWork("test_work")}返回 Result.success()

}

我正在使用的库: implementation 'androidx.work:work-runtime-ktx:2.2.0'

我在使用 WorkManager OneTimeWorkRequest setInitialDelay 时遇到问题.

当应用程序在前台或最近的列表中时它工作正常.但是当我从最近的列表中删除应用程序时,一切都搞砸了.

我想达到什么目标?- 我想在一些任务挂起的几个小时后向用户发送通知,所以在一些 R&D 开始工作后使用 WorkManager 因为它能够在没有后台服务限制的情况下安排任务.

现在下面是代码片段,直到应用程序没有从最近的应用程序中删除:

 约束约束 = new Constraints.Builder().setRequiresBatteryNotLow(真).建造();final OneTimeWorkRequest simpleRequest = new OneTimeWorkRequest.Builder(MyWorker.class).setInitialDelay(3, TimeUnit.MINUTES).setConstraints(约束).addTag("simple_work").建造();WorkManager workManager = WorkManager.getInstance();workManager.beginUniqueWork("simple_work", ExistingWorkPolicy.KEEP, simpleRequest).enqueue();

工人阶级

 public class MyWorker extends Worker {私有 NotificationUtils notificationUtils;public static final String EXTRA_OUTPUT_MESSAGE = "output_message";public MyWorker(@NonNull 上下文上下文,@NonNull WorkerParameters workerParams){超级(上下文,workerParams);}@非空@覆盖公共结果 doWork() {notificationUtils = new NotificationUtils(getApplicationContext());notificationUtils.showNotificationMessage("TITLE", "This is a MESSEAGE",2);数据输出 = new Data.Builder().putString(EXTRA_OUTPUT_MESSAGE, "我来自 MyWorker!").建造();设置输出数据(输出);返回结果.成功;}}

问题是从最近的列表中删除它之后它是发送通知但是在我设置的双倍时间之后.例如我设置 setInitialDelay 5 分钟,但它在 10 分钟后工作.

所以,请指导我我做错了什么,或者它不是为了在我设置的特定时间安排任务.完成后我不想继续重复工作.我在完成第一个 OneTimeWorkRequest 后创建新的,所以它必须按照记录的 beginUniqueWork 正常工作.

我正在使用的库: 实现android.arch.work:work-runtime:1.0.0-alpha11"

英语不是我的母语,请原谅我的语法错误:)

解决方案

您的问题不清楚,但请将最新的工作管理器库更新为 android.arch.work:work-runtime:1.0.0-beta03

你能解释一下为什么你需要对独特的作品进行排队吗?

workManager.beginUniqueWork("simple_work", ExistingWorkPolicy.KEEP, simpleRequest).enqueue();

尝试将其替换为 workManager.enque(simpleRequest); 并让我知道是否有效

UPDATE (21-nov-2019)

WorkManager.getInstance(activity).enqueueUniquePeriodicWork("test_work",
                                                ExistingPeriodicWorkPolicy.KEEP,
                                                PeriodicWorkRequest.Builder(MyWorker::class.java,
                                                        15, TimeUnit.MINUTES)
                                                        .build())

Now I'm using PeriodicWork and now doWork() called twice even I cancelled uniquettask at first attempt.I'm getting Notification twice and Checked in Log also It's called twice.

override fun doWork(): Result {


            if (checkTaskFinished()) {
                Logger.e("checkXXX----Hurrayyyy  ☻♥☺")
                val notificationUtils: NotificationUtils = NotificationUtils(applicationContext)
                notificationUtils.showNotificationMessage("Readddd", "rwaeaeae.", 2)


                WorkManager.getInstance(context).cancelUniqueWork("test_work")
            }

    return Result.success()

}


OLD

I'm facing problem with WorkManager OneTimeWorkRequest setInitialDelay.

It's work fine when app is in forground or in recent list. But When I remove App from recent list everything is messed up.

What I want to achieve ?- I want send notification to user after few hours when some task is pending ,so after some R&D start work using WorkManager because of It's ability to Schedule Tasks without background service limitation.

    Constraints constraints = new Constraints.Builder()
                                .setRequiresBatteryNotLow(true)
                                .build();

    final OneTimeWorkRequest simpleRequest = new OneTimeWorkRequest.Builder(MyWorker.class)
            .setInitialDelay(3, TimeUnit.MINUTES)
            .setConstraints(constraints)
            .addTag("simple_work")
            .build();

    WorkManager workManager = WorkManager.getInstance();

    workManager.beginUniqueWork("simple_work", ExistingWorkPolicy.KEEP, simpleRequest).enqueue();

Worker class

    public class MyWorker extends Worker {
    private NotificationUtils notificationUtils;
    public static final String EXTRA_OUTPUT_MESSAGE = "output_message";

    public MyWorker(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {

        notificationUtils = new NotificationUtils(getApplicationContext());
        notificationUtils.showNotificationMessage("TITLE", "This is a MESSEAGE",2);

        Data output = new Data.Builder()
                .putString(EXTRA_OUTPUT_MESSAGE, "I have come from MyWorker!")
                .build();

        setOutputData(output);

        return Result.SUCCESS;
    }


}

So ,Please guide me what I do wrong or It's not for schedule task at specific time which I set for once. I don't want to keep repeat work after It's done. I'm create just new after finish first OneTimeWorkRequest so It has to work fine as per documented beginUniqueWork.

English isn't my native language so pardon me for grammatically mistake:)

解决方案

You problem is not clear though please update latest work manager lib to android.arch.work:work-runtime:1.0.0-beta03

And you can explain me why do u need to enque the unique work ?

workManager.beginUniqueWork("simple_work", ExistingWorkPolicy.KEEP, simpleRequest).enqueue();

try to replace it with workManager.enque(simpleRequest); and let me know if worked

这篇关于WorkManager OneTimeWorkRequest InitialDelay 在设置的时间后起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-27 09:11