首页 > 解决方案 > JobScheduler 无法接受参数。必须是空构造函数

问题描述

我正在玩 JobScheduler,我发现了限制。我想在 Job 之后执行请求,但是,我无法在没有收到错误的情况下向 JobScheduler 添加参数。

没有零参数构造函数

这是示例代码(有效)

public class MyJob extends JobService {

 private JobParameters params;
 private MyLargeTask largeTask;

 @Override
 public boolean onStartJob(JobParameters params) {
   // get param to use if if needed ...
   this.params = params;
   largeTask = new MyLargeTask();
   largeTask.execute();
   return false;
 }

 @Override
 public boolean onStopJob(JobParameters params) {
   if (largeTask != null)
     largeTask.cancel(true);

   return false;
 }

  // large task used ...
  private class MyLargeTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPostExecute(Void aVoid) {
      jobFinished(params, false);
      super.onPostExecute(aVoid);
    }

    @Override
    protected Void doInBackground(Void... params) {
      // Instead of making a request here, I have to call method outside of the asynctask
      return null;
    }
 }

}

如果我尝试添加一个构造函数,我不知道如何访问它,因为对 MyJob 的唯一引用是在检索 JobInfo 的过程中。

ComponentName componentName = new ComponentName(getApplicationContext(), MyJob.class);
JobInfo jobInfo = new JobInfo.Builder(1, componentName).setRequiredNetworkCapabilities(JobInfo.NetworkType.UNMETERED).setRequiresCharging(true).build();
JobScheduler jobScheduler = (JobScheduler) getApplicationContext().getSystemService(JOB_SCHEDULER_SERVICE);
jobScheduler.schedule(jobInfo);

所以我无法添加一个构造函数,例如

public MyJob(RequestModel request) {
   ...
}

有没有可以解决这个问题的模式?我唯一的想法是创建一个静态方法,在其中执行请求,然后在 doInBackground 中调用该方法。但是如果我可以创建一个构造函数,所有这些都可以避免。

标签: androidjob-schedulingandroid-jobscheduler

解决方案


您可以通过 向作业添加参数JobInfo.Builder.setExtras(PersistableBundle extras)

您不能传递普通的 Java 对象,因为您的应用程序的进程可能会在作业运行时被终止。


推荐阅读