如何减少WorkManager中PeriodicWorkManager的时间

时间:2019-03-13 06:52:26

标签: android android-jetpack android-workmanager

PeriodicTimeRequest中,最小周期性时间为15分钟。我想将其从15分钟减少到15分钟以下。我该怎么做?

5 个答案:

答案 0 :(得分:0)

您不能更改15分钟的最短时间。如果可以将其更改为小于该值,则将其称为最小值。 根据您的需要,尝试使用警报管理器或FCM。 有关更多详细信息,请参见以下链接:https://developer.android.com/training/efficient-downloads/regular_updates

答案 1 :(得分:0)

否,您不能将时间减少到少于PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS,即 15分钟 由于节省了电池,所以这是系统的局限性,没有黑客。

答案 2 :(得分:0)

我们有办法减少15分钟的定期运行时间。但是您不能使用PeriodicWorkRequest。创建具有初始延迟的OneTimeWorkRequest,并在worker内部工作结束时调用self。如果需要,创建  backgroundExecutor.execute {}并从内部进行调用以进行异步调用。意味着调用self的worker将不会被终止,或者onStopped()不会被调用。

ExistingWorkPolicy.REPLACE |可能需要保留KEEP,具体取决于您的需求。

答案 3 :(得分:0)

一个简单的答案是,您不能将时间减少到少于MIN_PERIODIC_INTERVAL_MILLIS,该时间硬编码为15分钟。

但是,您可以比MIN_PERIODIC_INTERVAL_MILLIS早15分钟来测试PeriodicWorkRequest。

为此,您需要WorkManagerTestInitHelper中的androidx.work.testing

首先在您的应用或模块的build.gradle文件中添加以下依赖项:

//Current stable release is 2.3.4
androidTestImplementation "androidx.work:work-testing:2.3.4

接下来,您需要使用setPeriodDelayMet可用的TestDriver方法,该方法可以用来指示一个间隔已完成,并且比MIN_PERIODIC_INTERVAL_MILLIS(15分钟)要早执行PeriodicWorkRequest。 示例代码:

@Test
public void testPeriodicWork(Context context) throws Exception {
    // Setup input data
    Data input = new Data.Builder().put(KEY_1, 1).put(KEY_2, 2).build();

    // Create periodic work request
    PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(MyWorker.class, 15,  TimeUnit.MINUTES)
                                       .setInputData(input)
                                       .build();
    // Enqueue periodic request
    WorkManager.getInstance(context).enqueueUniquePeriodicWork(WORKER_TAG, ExistingPeriodicWorkPolicy.REPLACE, request);

    // Initialize testDriver
    TestDriver testDriver = WorkManagerTestInitHelper.getTestDriver();

    // Tells the testing framework the period delay is met, this will execute your code in doWork() in MyWorker class
    testDriver.setPeriodDelayMet(request.getId());

}

您可以在https://developer.android.com/topic/libraries/architecture/workmanager/how-to/integration-testing#periodic-work

中找到有关测试PeriodicWorkRequest的更多信息。

https://developer.android.com/reference/androidx/work/testing/WorkManagerTestInitHelperhttps://developer.android.com/reference/androidx/work/testing/TestDriver上了解有关测试WorkManager的更多信息

答案 4 :(得分:0)

如果间隔时间少于15分钟。我会创建多个任务,例如:

if (PublicStaticData.systemSet.rescueuploadinterval <= 15) {
          WorkManager.getInstance(this).cancelAllWorkByTag("uploadLocationWork")
          val tasks = 15 / PublicStaticData.systemSet.rescueuploadinterval
          for (taskNo in 0 until tasks) {
            val uploadLocationWork = PeriodicWorkRequestBuilder<UploadLocationWork>(
                PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
                .addTag("uploadLocationWork")
                .setInitialDelay((PublicStaticData.systemSet.rescueuploadinterval * taskNo).toLong(), TimeUnit.MINUTES)
                .build()
            WorkManager.getInstance(this).enqueue(uploadLocationWork)
            Log.e("jjj", "任务${taskNo}延迟${PublicStaticData.systemSet.rescueuploadinterval * taskNo}开始")
          }
        } else {
          // 超过15分钟,正常用就行
          WorkManager.getInstance(this).cancelAllWorkByTag("uploadLocationWork")
          val uploadLocationWork = PeriodicWorkRequestBuilder<UploadLocationWork>(
              PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
              .addTag("uploadLocationWork")
              .setInitialDelay(PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
              .build()
          WorkManager.getInstance(this).enqueue(uploadLocationWork)
        }

存在可接受的偏差。