android - 从 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)
我不知道出了什么问题...
解决方案
推荐阅读
- openstack - 无法访问 openstack 中的实例
- sql - 仅获取特定位置条件的 LHS 数据
- 3d - 使用 FirstPersonCameraController 在透视相机上重置(滚动)旋转
- .net - .Net (clrjit.dll) 的 JIT 编译器崩溃
- database - RANKX 针对不同的值显示相同的排名号
- performance - 是否有可能使用 Puppeteer 获得 Chrome DevTools 的性能总结秒数?
- android - 高度较小的Android View闪烁
- c# - 当玩家与触发器发生碰撞时,如何启用游戏对象的组件?
- javascript - 为什么这个递归会按照它的方式执行?
- python - 是否创建了两个不同的模块来存储 __name__ 变量的信息?