改造+ Otto + AA,如何做简单的获取请求?

时间:2016-08-20 15:07:02

标签: android retrofit android-annotations otto

我正在使用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!

1 个答案:

答案 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();

}