如何 return Java 来自 Retrofit2 的对象调用 OnResponse

How to return Java Object from Retrofit2 call OnResponse

我有一个 Restful API 对象 return 一个 Java 对象给我。当 return 那个对象它仍然是空的,因为异步线程还在工作。如何获得该响应,然后 return 到我的 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();
}

当我进行此调试时,它的工作原理是处理时间。

帮帮我?

You shouldn't return that directly.

如您所述,Retrofit 响应已在后台线程中更新。

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