首页 > 解决方案 > 从 JobScheduler 的 onStartJob() 使用 Retrofit 进行 API 调用

问题描述

我不知道这是否可能。请注意,我JobScheduler只研究了一天,所以如果我弄错了,我很抱歉。

所以我刚刚创建了一个 MainActivity,我直接想从中安排一个作业,并使其定期进行,比如每 5 秒我需要点击我的 REST 端点并返回一个随机整数(我在 Spring Boot 中得到了该部分)。

据我所见,在JobScheduler'sonStartJob()中, AsyncTask 被初始化,它的 doPostExecute 被定义,并且方法 execute() 在 AsyncTask 对象上被调用,如下所示:

@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;
}

实际上,我对后端而不是 AsyncTask 进行了 Retrofit 调用,如下所示:

   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;
            }
        });
    }
}

回到我的 MainActivity,我在onResume这段代码中检查结果状态:

@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");
}

最后我得到这样的错误:

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) 

我不知道出了什么问题...

标签: androidserviceandroid-asynctaskretrofitandroid-jobscheduler

解决方案


推荐阅读