Android MVVM 和 Retrofit api 响应为空

标签 android mvvm retrofit android-room android-databinding

此函数用于登录用户。我正在使用数据绑定(bind)和 RxJava

public void loginUser(String idNumber, String password) {
    RetrofitService.getApiService()
            .agentLogin(new LoginRequest(idNumber, password))
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Action1<Response<LoginResponse>>() {
                @Override
                public void call(Response<LoginResponse> userResponse) {
                    if (userResponse.isSuccessful() ) {
                        executor.execute(new Runnable() {
                            @Override
                            public void run() {

                                Log.i("AUTHKEY",userResponse.body().getUser().getAuthKey());
                                userDao.insert(userResponse.body().getUser());
                            }
                        });
                    }
                }
            });

}

当我记录 Log.i("AUTHKEY",userResponse.body().getUser().getAuthKey());

时应用失败

错误 java.lang.NullPointerException:尝试在空对象引用上调用虚方法 'java.lang.Integer com.vuna.agent.model.LoginResponse$User.getId()'

From the Okhttp logger, the server returns the right response

2019-04-12 12:33:36.707 28896-29064/com.vuna.agent D/OkHttp: <-- 200 OK http://example.com/login (923ms)

2019-04-12 12:33:36.709 28896-29064/com.vuna.agent D/OkHttp: {"code":201,"message":"You are now logged in!","id":2,"firstname":"Victor","lastname":"Amwollo","authkey":"22sA1JvVo4hmzhps1NVIO7_B6f4yCp_e"}
2019-04-12 12:33:36.709 28896-29064/com.vuna.agent D/OkHttp: <-- END HTTP (141-byte body)

Here is the LoginResponse class with an inner Entity class

public class LoginResponse {

    private Boolean success;

    private User user;


    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }


    @Entity(tableName = "user")
    public static class User {

        @PrimaryKey(autoGenerate = true)
        @SerializedName("id")
        private Integer id;

        private String firstName;
        private String lastName;

        private String authKey;

        //getters and setters

    }
}

为什么会出现错误?

最佳答案

response 上的 response.body() 方法将读取输入 (网络) 流并将其转换为字符串。因此它会动态构建字符串并将其返回给您。第二次调用时,网络流已经被消耗,不再可用。

因此,解决方案是将响应的结果保存到一个变量中,然后根据需要多次访问它。

查看下面的代码:

@Override
public void call(Response<LoginResponse> userResponse) {
    if (userResponse.isSuccessful() ) {
        LoginResponse data = userResponse.body(); // Consume response body once and then use it in this method further
        executor.execute(new Runnable() {
            @Override
            public void run() {
                Log.i("AUTHKEY", data.getUser().getAuthKey()); // access data variable here
                userDao.insert(data.getUser()); // access data variable here
            }
        });
    }
}

关于Android MVVM 和 Retrofit api 响应为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55649010/

相关文章:

android - 改造上传图片

android jacoco 覆盖率显示 0% 与 gradle 但是有 95% 的测试覆盖代码

android - Eclipse 到 Android Studio 导入

文本框中的 WPF 命令参数

android - 如何从 Retrofit v2 的 onResponse 返回值

java - Json数组和改造

android - 如何使用Google CardBoard SDK 实现Google StreetView?

android - 模拟 admob 上的点击 (Android)

c# - 具有不同数量对象的 WPF MVVM View 。如何?

c# - 从子 ViewModel 到父 ViewModel 的属性返回值