JobScheduler 无法接受参数。必须为空构造函数
JobScheduler Cannot Accept Parameters. Must Be Empty Constructor
我在玩 JobScheduler,我发现了局限性。我想在作业之后执行请求,但是,我无法在不收到错误的情况下向 JobScheduler 添加参数。
has no zero argument constructor
这是示例代码(有效)
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 中调用该方法。但是如果我可以创建一个构造函数,所有这些都可以避免。
您可以通过 JobInfo.Builder.setExtras(PersistableBundle extras)
向作业添加参数。
您不能传递正常的 Java 对象,因为您的应用进程可能会在作业 运行.
时终止
我在玩 JobScheduler,我发现了局限性。我想在作业之后执行请求,但是,我无法在不收到错误的情况下向 JobScheduler 添加参数。
has no zero argument constructor
这是示例代码(有效)
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 中调用该方法。但是如果我可以创建一个构造函数,所有这些都可以避免。
您可以通过 JobInfo.Builder.setExtras(PersistableBundle extras)
向作业添加参数。
您不能传递正常的 Java 对象,因为您的应用进程可能会在作业 运行.
时终止