从重写的回调中返回一个值

时间:2016-11-20 06:03:44

标签: android firebase callback firebase-authentication

我正在拨打电话获取Firebase令牌,然后使用该令牌从我的服务器获取令牌。

我希望userSignIn()从我的服务器返回令牌 有谁知道如何将令牌返回userSignIn()

@Override
public String userSignIn(String email, String password, String authType) throws Exception {
    login(email, password, authType, new OnLoginResponseCallback() {
        @Override
        public String onLoginResponse(boolean success, String token) {
            **return token;** // how do I return this to userSignIn???
        }
    });
}

public interface OnLoginResponseCallback {
    public String onLoginResponse(boolean success, String token);
}

public void login(String email, String password, String authType, final OnLoginResponseCallback callback) throws Exception {
    getFirebaseToken(email, password, new OnFirebaseTokenResponseCallback() {
        @Override
        public String onFirebaseTokenResponse(boolean success, String token) {
            getAuthToken(token, null, new OnAuthTokenResponseCallback(){
                @Override
                public String onAuthTokenResponse(boolean success, JSONObject response){
                    try {
                        String access_token = response.getString("access_token");
                        callback.onLoginResponse(true, access_token);
                    }
                    catch (JSONException ex) {

                    }
                }
            });
        }
    });
}

public interface OnFirebaseTokenResponseCallback {
    public String onFirebaseTokenResponse(boolean success, String token);
}

public void getFirebaseToken(String email, String password, final OnFirebaseTokenResponseCallback callback) {
    FirebaseAuth auth = FirebaseAuth.getInstance();
    auth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (!task.isSuccessful()) {

                    } else {
                        AuthResult result = task.getResult();
                        FirebaseUser user = result.getUser();
                        user.getToken(false).addOnCompleteListener(new OnCompleteListener<GetTokenResult>() {
                            @Override
                            public void onComplete(@NonNull Task<GetTokenResult> task) {
                                if (task.isSuccessful()) {
                                    try {
                                        String token = task.getResult().getToken();
                                        callback.onFirebaseTokenResponse(true, token);
                                    }
                                    catch (Exception ex) {

                                    }
                                } else {

                                }
                            }
                        });
                    }
                }
            });
}


public interface OnAuthTokenResponseCallback {
    public String onAuthTokenResponse(boolean success, JSONObject response);
}

public void getAuthToken(String token, String refreshToken, final OnAuthTokenResponseCallback callback) throws JSONException {
    RequestParams params = new RequestParams();
    if (refreshToken != null)
    {
        params.add("grant_type", "refresh_token");
        params.add("refresh_token", refreshToken);
    }
    else if (token != null)
    {
        params.add("grant_type", "urn:ietf:params:oauth:grant-type:firebase_token");
        params.add("assertion", token);
    }
    else if (refreshToken == null && token == null)
    {
        params.add("grant_type", "password");
        params.add("username", "");
        params.add("password", "");
    }
    AuthClient.post("connect/token", params, new JsonHttpResponseHandler() {
        @Override
        public void onSuccess(int statusCode, cz.msebera.android.httpclient.Header[] headers, JSONObject response) {
            try {
                callback.onAuthTokenResponse(true, response);
            } catch (Exception ex) {

            }
        }
        @Override
        public void onFailure(int statusCode, cz.msebera.android.httpclient.Header[] headers, Throwable throwable, JSONObject response) {
            callback.onAuthTokenResponse(false, new JSONObject());
        }
    });
}

更新

感谢。我删除了冗余方法,并按如下方式调用login:

.login(userName, userPass, mAuthTokenType, new OnLoginResponseCallback() {
    @Override
    public void onLoginResponse(boolean success, String token) {
    data.putString(AccountManager.KEY_ACCOUNT_NAME, userName);
    data.putString(AccountManager.KEY_ACCOUNT_TYPE, accountType);
    data.putString(AccountManager.KEY_AUTHTOKEN, token);
    data.putString(PARAM_USER_PASS, userPass);
    }
});

我认为它有效,但还没有机会对它进行全面测试。我不确定的一件事是我试图用“令牌”中的值修改“数据”,但“数据”是最终的捆绑包,所以我不确定这是否有效。稍后会测试。感谢。

2 个答案:

答案 0 :(得分:1)

为什么你要从那里返回令牌,因为你已经在这个方法之下了!您可以在onLoginResponse()内完成其余工作,也可以调用其他方法。

答案 1 :(得分:1)

您调用的方法基本上调用了同一签名的另一种方法

@Override
public String userSignIn(String email, String password, String authType) throws Exception {
    login(email, password, authType, new OnLoginResponseCallback() {
        @Override

相反,只要您调用userSignIn,就会调用login,然后传入该匿名类。你无法从这些内部方法中返回,因为这不是回调的工作方式。您可以使用接口方法的参数来&#34;继续&#34;你的逻辑。比如,登录,使用一些用户信息回调主函数,使用此信息发出新请求,等待该数据的回调,将数据传递回其他方法。它是调用其他方法的所有void方法。没有return陈述

虽然在Javascript中,你可以阅读这个

How to return value from an asynchronous callback function?