Making API call using Retrofit from JobScheduler's onStartJob()

Viewed 563

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...

0 Answers
Related