Android mLoggedInUser是否始终为空?
我正在调用login方法,但它总是返回login failed和mLoggedInUser总是null(NullPointerException) 如何在mLoggedInUser中传递响应。请帮忙Android mLoggedInUser是否始终为空?,android,retrofit,Android,Retrofit,我正在调用login方法,但它总是返回login failed和mLoggedInUser总是null(NullPointerException) 如何在mLoggedInUser中传递响应。请帮忙 public class LoginDataSource { private LoggedInUser mLoggedInUser; public Result<LoggedInUser> login(String username, String password)
public class LoginDataSource {
private LoggedInUser mLoggedInUser;
public Result<LoggedInUser> login(String username, String password) {
try {
// LoggedInUser fakeUser =
// new LoggedInUser(
// java.util.UUID.randomUUID().toString(),
// "Jane Doe");
Call<LoggedInUser> loggedInUserCall = API.getLoginService().login(username, password);
loggedInUserCall.enqueue(new Callback<LoggedInUser>() {
@Override
public void onResponse(Call<LoggedInUser> call, Response<LoggedInUser> response) {
mLoggedInUser = response.body();
}
@Override
public void onFailure(Call<LoggedInUser> call, Throwable t) {
}
});
if (mLoggedInUser != null)
return new Result.Success<>(mLoggedInUser);
return new Result.Error(new Exception("Login Failed"));
} catch (Exception e) {
return new Result.Error(new IOException("Error logging in", e));
}
}
public void logout() {
// TODO: revoke authentication
}
}
公共类登录数据源{
私有LoggedInUser mLoggedInUser;
公共结果登录(字符串用户名、字符串密码){
试一试{
//LoggedInUser fakeUser=
//新LoggedInUser(
//java.util.UUID.randomUUID().toString(),
//“无名氏”);
调用loggedInUserCall=API.getLoginService().login(用户名、密码);
loggedInUserCall.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
mLoggedInUser=response.body();
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
if(mLoggedInUser!=null)
返回新结果。成功(mLoggedInUser);
返回新结果。错误(新异常(“登录失败”);
}捕获(例外e){
返回新的Result.Error(新的IOException(“错误登录”,e));
}
}
公开作废注销(){
//TODO:撤消身份验证
}
}
您应该创建如下界面:
public interface NetworkResponseCallback {
public void onSuccess(LoggedInUser user);
public void onFailure(Throwable t);
}
然后编辑你的方法
public class LoginDataSource {
//private LoggedInUser mLoggedInUser;
public void login(String username, String password ,
NetworkResponseCallback callback) {
try {
// LoggedInUser fakeUser =
// new LoggedInUser(
// java.util.UUID.randomUUID().toString(),
// "Jane Doe");
Call<LoggedInUser> loggedInUserCall =
API.getLoginService().login(username, password);
loggedInUserCall.enqueue(new Callback<LoggedInUser>() {
@Override
public void onResponse(Call<LoggedInUser> call,
Response<LoggedInUser> response) {
//mLoggedInUser = response.body();
if (callback != null)
callback.onSuccess(response.body());
}
@Override
public void onFailure(Call<LoggedInUser> call, Throwable t) {
callback.onFailure(new Exception("Login Failed"));
}
});
// if (mLoggedInUser != null)
// return new Result.Success<>(mLoggedInUser);
// return new Result.Error(new Exception("Login Failed"));
} catch (Exception e) {
return new Result.Error(new IOException("Error logging in", e));
}
}
public void logout() {
// TODO: revoke authentication
}
}
公共类登录数据源{
//私有LoggedInUser mLoggedInUser;
公共无效登录(字符串用户名、字符串密码、,
NetworkResponseCallback(回调){
试一试{
//LoggedInUser fakeUser=
//新LoggedInUser(
//java.util.UUID.randomUUID().toString(),
//“无名氏”);
Call loggedInUserCall=
API.getLoginService().login(用户名、密码);
loggedInUserCall.enqueue(新回调(){
@凌驾
公共void onResponse(调用,
回应(回应){
//mLoggedInUser=response.body();
if(回调!=null)
onSuccess(response.body());
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
onFailure(新异常(“登录失败”);
}
});
//if(mLoggedInUser!=null)
//返回新结果。成功(mLoggedInUser);
//返回新结果。错误(新异常(“登录失败”);
}捕获(例外e){
返回新的Result.Error(新的IOException(“错误登录”,e));
}
}
公开作废注销(){
//TODO:撤消身份验证
}
}
这是一个异步调用,因此它将始终为null,因为您是从方法返回的。您必须使用回调将登录结果返回给调用方。如何使用回调请帮助我更正此代码。公共结果登录(字符串用户名,字符串密码){//handle login result result=dataSource.login(用户名,密码,mResponseCallback);if(result instanceof result.Success){setLoggedInUser(((Result.Success)Result).getData();}返回结果;}它将如何返回responseresult类用于保存结果