Android 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)

我正在调用login方法,但它总是返回login failed和mLoggedInUser总是null(NullPointerException)

如何在mLoggedInUser中传递响应。请帮忙

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类用于保存结果