【问题标题】:How to decrease time period of Workmanager Android?如何减少 Workmanager Android 的时间周期?
【发布时间】:2020-05-15 03:34:53
【问题描述】:

我一直在检查其他链接,stackoverflow 以减少工作管理器的时间段,但我发现下面的链接

How to reduce time of PeriodicWorkManager in WorkManager

上面的链接说最短时间是 15 分钟。

需要立即将数据从移动设备发送到服务器。 有没有办法缩短时间?

请帮助我。在此先感谢。

【问题讨论】:

    标签: android android-workmanager


    【解决方案1】:

    您可以将Worker 设为OneTimeWorkRequest,并在dowWork() 关闭(读取返回)之前,使其再次注册。 这将是这样的:

    val tenMinuteRequest = OneTimeWorkRequestBuilder<YourWorker>()
            .setInitialDelay(10, TimeUnit.MINUTES)
            .build()
    WorkManager.getInstance(applicationContext)
            .enqueue(tenMinuteRequest)
    //return Result.Success here or whatever
    

    当你从另一个类中解雇这个 Worker 时,它会 do 它的 work 并在之后重新安排自己,然后循环到这里。

    【讨论】:

    • 感谢您的回复,当前端有更新时,上面的代码有效吗?如果服务器端有任何更新,那么我们如何从服务器获取数据到前端?
    • Workmanger 在其后台线程上运行,因此在那里获取服务器数据非常好。如何?你在外面工作的方式,没有什么不同。工人会做你投入的任何工作。
    【解决方案2】:

    我设法做的是一种 hack。我从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

    【讨论】:

      【解决方案3】:

      work manager中,两个周期性请求之间的最小时间间隔为15 minutes

      阅读此文档:https://developer.android.com/reference/kotlin/androidx/work/PeriodicWorkRequest

      你不能在work manager中减少它。

      如果您想在这种情况下减少时间,您需要使用JobScheduler,它会提供具有特定时间间隔的选项来执行您的请求。

      https://developer.android.com/reference/android/app/job/JobScheduler

      【讨论】:

      • 感谢您的回复 Mehul,使用 JobScheduler 的缺点?
      • @Naveen JobScheduer 没有缺点。工作管理器向后兼容最高可达 API 14 在 API 23+ 的设备上使用 JobScheduler
      【解决方案4】:

      如果需要即时发送,可以试试OneTimeWorkRequest。 虽然它的执行也将取决于您添加的约束或其他一些情况,但大多数时候它会在您调用它之后立即开始。

      Docs, Refer

      编辑:

      如果你想要这个periodically,你可以创建一个PeriodicWorkRequest并在其中启动你的OneTimeWorkRequest

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

      如果您想立即同步一次,OneTimeWorker 将完成这项工作。

      但是,如果您想立即同步然后也安排它,请致电startOneTimeWorker(),然后致电startPeriodicWorker()。定期工作人员将在其中调用 startOneTimeWorker() doWork()

      所以第一次会立即调用OneTimeWorkRequest,然后按照PeriodicTimeWorkRequest的时间表调用。

      • 致电OneTimeWorkRequest
      • 安排PeriodicWorkRequest,在里面调用OneTimeWorkRequest

      【讨论】:

      • 感谢您的回复 Kashish,在您提到的最后 2 条语句中有点混乱。请你解释清楚
      • 所以当有人点击按钮什么的时候你需要发送数据,对吧?
      • 如果所有的约束都满足,它会立即启动,否则它会找到合适的时间来执行此操作,但在大多数情况下会立即启动。
      • 基本上,如果有一些数据需要从服务器发送到前端,无需单击右键即可立即完成?,这个oneTimeWorkRequest是否有任何时间段?
      • TimePeriod 用于 PeriodicWorkRequest,这意味着 PeriodicWorkRequest 应该有至少 15 分钟的间隔。但是您可以完全启动许多不同的定期请求。但是对于 OneTimeWorkRequest,没有这样的条件,但是您确实需要注意存在策略等,即如果新的工作已经开始并且旧的工作尚未完成,则取消以前的工作。请阅读文档以了解此类查询。如果我的回答对你有帮助,请采纳。
      【解决方案5】:

      如果您想一次性将数据从 Mobile 立即发送到服务器,请使用 OneTimeWorkRequestBuilder ,否则使用 ForeGround Service 而不是 WorkManager 将连续数据上传到服务器。

      这两种策略都将确保数据在服务器端上传。如果是繁重的上传工作,可能需要超过 10 分钟,请务必使用 ForeGround Service。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-28
        • 2017-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        相关资源
        最近更新 更多