I don't know if this is even possible. Please note, that I've been researching on JobScheduler only one day, so I'm sorry If I got something wrong.
So I just created one MainActivity, from it, I directly want to schedule a job, and make it periodical, say every 5 seconds I need to hit my REST endpoint and return a random integer (I got that part in Spring Boot covered).
From what I saw, in JobScheduler's onStartJob(), AsyncTask gets initialized, and its doPostExecute gets defined and method execute() is called on AsyncTask object, something like this:
@Override
public boolean onStartJob(JobParameters params) {
mJobExecutor = new JobExecutor() {
Override
protected void onPostExecute(int x){
Toast.makeText(getApplicationContext(), "Integer returned from backend " + x, Toast.LENGTH_SHORT).show();
}
}
mJobExecutor.execute();
return true;
}
I actually placed a Retrofit call to my backend instead of AsyncTask, like this:
public class MyJobScheduler extends JobService {
private Retrofit mRetrofit = RetrofitClient.getRetrofitInstance();
private MessageService mMessageService = mRetrofit.create(MessageService.class);
private JobParameters params;
@Override
public boolean onStartJob(JobParameters params) {
this.params = params;
Log.i("TAG", "onStartJob: fetching data begins");
fetchData();
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
private void fetchData(){
Call<Integer> call = mMessageService.getData();
call.enqueue(new Callback<Integer>() {
@Override
public void onResponse(Call<Integer> call, Response<Integer> response) {
if (!response.isSuccessful()){
Toast.makeText(getApplicationContext(), "erorr", Toast.LENGTH_SHORT);
return;
}
Toast.makeText(getApplicationContext(), "Integer returned " + response.body(), Toast.LENGTH_SHORT).show();
jobFinished(params, false);
}
@Override
public void onFailure(Call<Integer> call, Throwable t) {
Toast.makeText(getApplicationContext(), "errorrrrrr", Toast.LENGTH_SHORT).show();
return;
}
});
}
}
Back in my MainActivity, I have in onResume this piece of code which checks for result status:
@Override
protected void onResume() {
super.onResume();
int res = mJobScheduler.schedule(mJobInfo);
if (res == JobScheduler.RESULT_SUCCESS){
Log.i("res", "success");
} else Log.i("res", "fail");
}
Finally I get error like this:
E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
Process: ftn.sit.jobscheduler, PID: 17710
java.lang.BootstrapMethodError: Exception from call site #1 bootstrap method
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.onResponse(DefaultCallAdapterFactory.java:77)
at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:150)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
Caused by: java.lang.ClassCastException: Bootstrap method returned null
at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.onResponse(DefaultCallAdapterFactory.java:77)
at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:150)
at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:504)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:764)
I don't know what is wrong...