android - 如何从 Retrofit2 调用 OnResponse 返回 Java 对象

标签 android json retrofit retrofit2 response

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

这是我的改造电话:

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

当我进行此调试时,它通过处理时间起作用。

帮帮我?

最佳答案

You shouldn't return that directly.

正如您提到的,Retrofit 响应在后台线程中更新。

我建议只返回 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 一起使用 以将其转换为更易于维护的代码

关于android - 如何从 Retrofit2 调用 OnResponse 返回 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51341039/

相关文章:

android - Android NDK 新手 : definition in Android. mk

android - 如何在asmack,android中让用户在线或离线

java.lang. RuntimeException 未找到 Retrofit 注释。 (参数#3)

PHP 函数 json_decode 将点后带零的浮点值解码为 int

ios - 带有 NSDictionary、NSArray、JSON 和 HTML 数据的 NSPredicate

android - 将 CookieHandler 与 OkHttp 和 Retrofit 2 一起使用

java - 如何在 setText 中将 api 中的数据作为数组传递

java - findViewById() 无法在我的自定义适配器中解析

android - 无法使用 smack 接收群组消息

java - 如何在 jackson 反序列化过程中忽略 json 数组的类型信息?