我正在使用Android Annotation
进行样板制作,并使用Repofit进行Api调用,在通过改造进行发布请求时,我发现了一些问题:
当我调用异步调用" GET"请求使用Retrofit,我需要在我的电话完成后做一些操作,我不能使用" onResponse()"因为我正在使用" Bean"注释
它没有意义吗?看看代码
示例Bean类:
@EBean
public class someClass{
/* Suppose api is getting RestClient reference from Retrofit*/
@AfterInject
void doSomeWork(){ api = SampleAPI.Factory.getIstance(mcontext);}
/**
* Get list of all courses from database
* @Return List<CourseInfo> courseInfo objects
*/
public List<CourseInfo> GetCoursesList() {
final List<CourseInfo> cor = new ArrayList<>();
api.getAllCourses(user.getApikey()).enqueue(new Callback<List<CourseInfo>>() {
@Override
public void onResponse(retrofit2.Call<List<CourseInfo>> call, Response<List<CourseInfo>> response) {
Collections.copy(cor,response.body());
}
@Override
public void onFailure(retrofit2.Call<List<CourseInfo>> call, Throwable t) {
UiHelpers.showToast(mcontext,"Unable to get List of Course Names");
}
});
return cor;
}
}
在Activity中调用类似于:
@EActivity(R.layout.something)
public class student extends AppCompatActivity {
@Bean
someClass some;
@AfterViews
void setInits(){
course = cc.GetCoursesList();
Toast.makeText(this,"Why this is running before getting all courses??",Toast.LENGTH_LONG).show();
}
}
我想知道如何使用Otto改进这种结构? v 为什么我的这种结构失败了呢? 因为我无法从服务器获取coursesList!
答案 0 :(得分:0)
在获得所有课程之前为什么会这样?
因为异步代码的工作原理是什么?
改造不是阻止通话。
如果你想在UI线程上从onResponse执行一个动作,你甚至不需要一个EventBus库,只需将回调作为方法的参数。
public void GetCoursesList(Callback<List<CourseInfo>> callback) {
api.getAllCourses(user.getApikey()).enqueue(callback);
}
该方法现在无效,因为Retrofit再次没有阻止,因此您在服务器请求发生时返回了一个空列表
@AfterViews
void setInits(){
cc.GetCoursesList(new Callback<List<CourseInfo>>() {
// TODO: Implement the interface
} );
Toast.makeText(this,"Why this is running before getting all courses??",Toast.LENGTH_LONG).show();
}