如何缩短Android WorkManager的时间周期?

5

我一直在查找其他链接和stackoverflow以缩短WorkManager的时间周期,但是我发现以下链接:

如何在WorkManager中缩短PeriodicWorkManager的时间

上述链接说明最短时间为15分钟。

需要立即从手机发送数据到服务器。是否有任何替代方法来缩短时间周期?

请在此方面给予帮助。提前致谢。

5个回答

2
您可以使用OneTimeWorkRequest创建您的Worker,并在其doWork()方法即将关闭(即返回)之前,让它再次注册自己。代码示例如下:
val tenMinuteRequest = OneTimeWorkRequestBuilder<YourWorker>()
        .setInitialDelay(10, TimeUnit.MINUTES)
        .build()
WorkManager.getInstance(applicationContext)
        .enqueue(tenMinuteRequest)
//return Result.Success here or whatever

当你从另一个类中启动这个Worker时,它会执行它的工作并在之后重新安排自己的任务,然后开始循环。

谢谢您的回复,上面的代码在前端有更新时可以工作,对吧?如果服务器端有任何更新,我们该如何将数据从服务器传递到前端呢? - Naveen
WorkManager 在它的后台线程上运行,因此在那里获取服务器数据是完全可以的。如何做到这一点?和在 WorkManager 之外的方式没有区别。一个 worker 将会执行你所放入其中的任何工作。 - Mohamed Hamza

2
我所做的是一种类似于黑客技巧的方法。我从doWork()递归调用了一个方法,然后每次检查时间差异,以便在15分钟之前停止递归。
   override suspend fun doWork(): Result {
        startTime = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis())

        doSomeWork()

        return Result.success()
    }

   private suspend fun doSomeWork() {
        Log.d("SomeWorker", "-------> working")

        val currentTime = TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis())
        val diff = currentTime - startTime
        if (diff < 12L) {
            Thread.sleep(30000) // this is the new time interval
            doSomeWork()
        }
    }

这是完整的工作类: https://gist.github.com/WSAyan/7f3a75d05332984e24ad5418f0b1e38b

0
如果您想要将数据从移动设备即时发送到服务器,则可以使用OneTimeWorkRequestBuilder。如果需要持续上传数据到服务器,则应该使用前台服务而不是WorkManager。
这两种策略都可以确保在服务器端上传数据。如果上传的工作量较大,可能需要超过10分钟,请务必使用前台服务。

0

谢谢您的回复,Mehul。使用JobScheduler的缺点是什么? - Naveen
没有JobScheduler的缺点。 WorkManager向后兼容性可达API 14。 在API 23+的设备上使用JobScheduler。 - Mehul Kabaria

0
如果您需要立即发送,可以尝试使用OneTimeWorkRequest。虽然它的执行也会依赖于您添加的约束或其他情况,但大多数情况下,它会在调用后立即启动。

文档, 参考

编辑:

然后,如果您想要定期执行,可以创建一个PeriodicWorkRequest并在其中启动您的OneTimeWorkRequest

例如,假设您有两种方法:startOneTimeWorker()startPeriodicWorker()

如果您想要一次同步并立即执行,则OneTimeWorker将完成工作。

但是如果你想要立即同步并且也要安排计划,调用startOneTimeWorker(),然后调用startPeriodicWorker()。其中周期性工作将在其doWork()中调用startOneTimeWorker()

因此,第一次将立即调用OneTimeWorkRequest,然后根据PeriodicTimeWorkRequest的计划进行调用。

  • 调用OneTimeWorkRequest
  • 安排PeriodicWorkRequest,在其中调用OneTimeWorkRequest

谢谢您的回复Kashish,您提到的最后两个声明有点令人困惑。能否请您清楚地解释一下? - Naveen
基本上,如果有一些数据需要从服务器发送到前端,这可以在没有按钮点击的情况下立即完成,对吧?那么这个oneTimeWorkRequest有任何时间限制吗? - Naveen
TimePeriod是为了PeriodicWorkRequest而设计的,这意味着PeriodicWorkRequest应该至少有15分钟的间隔。但是你可以同时启动许多不同的周期请求。但对于OneTimeWorkRequest,没有这样的条件,但是你需要注意存在策略等,即如果新的工作已经开始而旧的工作还没有完成,则取消先前的工作。请阅读文档以获取此类查询的详细信息。如果我的回答对您有帮助,请接受它。 - Kashish Sharma
感谢您的惊人反应,我会接受它。有一个问题,如果有一些数据需要从服务器发送到前端,如何在没有按钮点击的情况下立即完成? - Naveen
有几种方法,可以通过定期查询服务器来不断检查,或者使用Firebase消息服务(FCM)。 从FCM向您的应用程序发送消息,表示有新数据可用,每当您的应用程序接收到该消息时,只需查询后端! - Kashish Sharma
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接