从另一个worker调度另一个worker

Scheduling another worker from another worker

我在 WorkManager about scheduling worker from another worker 上阅读了以下 post。我正在尝试将用 Java 编写的作业服务转换为 Kotlin 中的 WorkManager。

在我们当前的代码库中,当一个作业服务被调用时,它可以有条件地调用另一个作业服务。

我有一个自定义作业服务,它在后台获取 Firebase 令牌,如下所示:

public class FirebaseJobService extends JobService {
   
   @Override
   public boolean onStartJob(@NonNull final JobParameters jobParameters) {
         // Fetch Firebase token
         String firebaseToken = FirebaseInstanceId.getInstance().getToken(
             "12345" // Unique sender Id
             "FCM"
         );
         // Persist fcm token to local sqlite db.
         // Make another request to activate token on our backend. This is handled by another job service.
   }
}

此服务当前由下面给出的另一个服务调用

public class MyCustomJobService extends JobService {

   @Override
   public void onStartJob(@NonNull final JobParameters jobParameters) {
     . . . . . 
     
     boolean isForceActivationRequired = checkIfForceActivationRequired();
     
     String userId = getUserId(); // Helper function to get the user ID.
     
     // How can I call this service
     if (isForceActivationRequired) {
        PersistableBundle bundle = PersistableBundle();
        bundle.putString("userId", userId);
        bundle.putBoolean("forceActivation", isForceActivationRequired);
        JobInfo.Builder jobInfoBuilder = new JobInfo.Builder(1500, new ComponentName(context, FirebaseJobService.class));
        jobInfoBuilder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
            jobInfoBuilder.setExtras(persistableBundle);
        
        // Schedule the job
        final JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        scheduler.schedule(jobInfoBuilder.build());
     }
   }
}

我正在尝试将 MyCustomJobService 转换为使用 WorkManager 库,然后再尝试使用所有其他作业服务。我的问题如下:

  1. 如何安排工作服务的工作请求?我打算把底层的job service转为worker实现
  2. 一旦我迁移了多个 worker,那么如何安排一个 worker 到另一个 worker?他们的结果是相互独立的,所以他们会有不同的工作 IDS。

这可能是适合您的解决方案。

  1. 您可以为新创建的工作人员创建一个 WorkRequest。
val workRequest: WorkRequest = OneTimeWorkRequestBuilder<YourNewWorker>().build()
  1. 向系统提交工作要求运行。
WorkManager.getInstance(context).enqueue(workRequest)

这可以用于您的 JobService 或您拥有的其他工人。我不建议 运行 在没有彻底测试代码并验证您的重试策略以及您为工作请求设置的任何其他选项的情况下,从另一个工作人员中挑选一个工作人员。可能会发生不良副作用。