【问题标题】:How to return Java Object from Retrofit2 call OnResponse如何从 Retrofit2 调用 OnResponse 返回 Java 对象
【发布时间】:2018-12-22 18:35:07
【问题描述】:

我有一个 Restful API,它为我返回一个 Java 对象。当返回该对象时,它仍然是空的,因为异步线程仍在工作。如何获得该响应并返回给我的 Presenter 并将正确的响应定向到视图?

这是我的改造电话:

 public String checkUser(final ModelUser modelUser) throws IOException {

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(UserRetrofitAPI.BASE_SERVICE)
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    UserRetrofitAPI userRetrofitAPI = retrofit.create(UserRetrofitAPI.class);
    Call<ModelUser> requestCheckUser = userRetrofitAPI.checkUser(modelUser.getUser(), modelUser.getPassword());
    requestCheckUser.enqueue(new Callback<ModelUser>() {
        @Override
        public void onResponse(Call<ModelUser> call, retrofit2.Response<ModelUser> response) {
            if(!response.isSuccessful()){

                myModelUser = new ModelUser(modelUser.getUser(),modelUser.getPassword(), String.valueOf(response.code()));

            } else {

                ModelUser modelUserChecked = response.body();
                myModelUser = modelUserChecked;
            }
        }

        @Override
        public void onFailure(Call<ModelUser> call, Throwable t) {

            Exception ex = new Exception(t);

            myModelUser = new ModelUser(modelUser.getUser(), modelUser.getPassword(), ex.toString());

        }
    });

    return myModelUser.getResponse();
}

当我进行此调试时,它会按处理时间工作。

帮帮我?

【问题讨论】:

    标签: android json retrofit retrofit2 response


    【解决方案1】:

    你不应该直接退货。

    正如你提到的改造响应在后台线程中更新。

    我建议只返回 requestCheckUser 并在您的 Presenter

    中观察
    public Call<ModelUser> checkUser(final ModelUser modelUser) throws IOException {
    
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(UserRetrofitAPI.BASE_SERVICE)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    
        UserRetrofitAPI userRetrofitAPI = retrofit.create(UserRetrofitAPI.class);
        Call<ModelUser> requestCheckUser = userRetrofitAPI.checkUser(modelUser.getUser(), modelUser.getPassword());
    
        return requestCheckUser;
    }
    

    观察Presenter 中对该调用的响应,并执行如下所需的操作

    checkUser(modelUser).enqueue(new Callback<ModelUser>() {
        @Override
        public void onResponse(Call<ModelUser> call, retrofit2.Response<ModelUser> response) {
            if(!response.isSuccessful()){
    
                myModelUser = new ModelUser(modelUser.getUser(),modelUser.getPassword(), String.valueOf(response.code()));
    
            } else {
    
                ModelUser modelUserChecked = response.body();
                myModelUser = modelUserChecked;
            }
        }
    
        @Override
        public void onFailure(Call<ModelUser> call, Throwable t) {
    
            Exception ex = new Exception(t);
    
            myModelUser = new ModelUser(modelUser.getUser(), modelUser.getPassword(), ex.toString());
    
        }
    });
    

    这将是简单的选项,并将满足这个用例和范围。 如果您不喜欢在 Presenter 中编写观察者,可以使用自定义接口侦听器

    我建议研究 RxJava 并将其与 Retrofit 一起使用 将其转换为更易于维护的代码

    【讨论】:

    • 很高兴它有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多