此函数用于登录用户。我正在使用数据绑定(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/