代码之家  ›  专栏  ›  技术社区  ›  Joshua

如何在不立即使用WorkManager运行的情况下更改定期工作请求周期?

  •  0
  • Joshua  · 技术社区  · 7 年前
    val request = PeriodicWorkRequestBuilder<FooWorker>(1, TimeUnit.DAYS).build()
    WorkManager.getInstance().enqueueUniquePeriodicWork(
        "FOO",
        ExistingPeriodicWorkPolicy.REPLACE,
        request
    )
    

    上面的代码已运行 onCreate 属于 Application 以确保请求已排队。但是,这将导致以下问题: FooWorker 将在每次用户启动应用程序时运行,因为 ExistingPeriodicWorkPolicy.REPLACE

    ExistingPeriodicWorkPolicy.KEEP ,即使周期或工人发生变化,我们也无法更换工作。

    有没有办法在当前请求运行后替换请求?

    例如,原始请求每天运行1次,而新请求每小时运行1次。在运行下一个原始请求之后,用新请求替换它。

    1 回复  |  直到 7 年前
        1
  •  6
  •   ianhanniballake    7 年前

    有没有办法做你想做的事情,定期工作在一个干净的方式。

    doWork 方法,就在返回之前 Result.SUCCESS :

    fun doWork(): Result {
      reallyDoWork()
      // Now schedule the next "periodic" work
      val request = OneTimeWorkRequestBuilder<FooWorker>().build()
      WorkManager.getInstance().enqueueUniqueWork(
        "FOO",
        ExistingWorkPolicy.REPLACE,
        request
      )
      return Result.SUCCESS
    }
    

    使用此设置,您的 onCreate() 属于 Application 可安全使用 ExistingWorkPolicy.KEEP

        2
  •  3
  •   meh guodage    7 年前

    enqueueUniquePeriodicWork .

      val request = PeriodicWorkRequest.Builder(FooWorker::class.java, 1, TimeUnit.DAYS).build()
      WorkManager.getInstance(appContext)
      .enqueueUniquePeriodicWork(WORK_TAG, ExistingPeriodicWorkPolicy.REPLACE, request)
    

    一定要通过 ExistingPeriodicWorkPolicy ExistingWorkPolicy

        3
  •  2
  •   Å emsudin Tafilović    5 年前

    如果你想用 ExistingPeriodicWorkPolicy.KEEP 而要仅在要更改重复间隔时更新PeriodicWorkRequest,WorkManager没有解决方案,但您可以将间隔保存在SharedReferences中,并检查间隔是否已更改。基于此,我们可以使用 ExistingPeriodicWorkPolicy.REPLACE

    public static void enqueue(Context context) {
            Log.d(TAG, "enqueue()");
            SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
            int repeatInterval = sharedPreferences.getInt("REPEAT_INTERVAL_HOURS", 0);
    
            PeriodicWorkRequest periodicWorkRequest = new PeriodicWorkRequest
                .Builder(FooWorker.class, REPEAT_INTERVAL_HOURS, TimeUnit.HOURS)
                .build();
    
            ExistingPeriodicWorkPolicy policy = repeatInterval == REPEAT_INTERVAL_HOURS ? ExistingPeriodicWorkPolicy.KEEP : ExistingPeriodicWorkPolicy.REPLACE;
    
            sharedPreferences.edit().putInt("REPEAT_INTERVAL_HOURS", REPEAT_INTERVAL_HOURS).apply();
    
            WorkManager.getInstance(context).enqueueUniquePeriodicWork("fileRemove", policy, periodicWorkRequest);
        }