You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio(Java)中String返回null,如何获取onComplete内的值供外部使用

为什么你拿到的是空值

Firestore的get()数据请求是异步操作,你添加的OnCompleteListener回调只会在网络/本地缓存请求完成后才会触发执行,而你写在addOnCompleteListener之后的Toast打印、Query构造代码,会在发起请求后立刻执行,此时回调还没返回结果,sex[0]还没有被赋值,所以拿到的就是空值。另外你代码里判断字符串相等用的==是错误的,Java中字符串内容比较需要用equals()方法。

解决方案1:将依赖sex值的逻辑移入回调(推荐)

直接把所有需要用到性别值的逻辑放到回调内部执行,是最简单的适配异步逻辑的方案:

DocumentReference documentReference = firebaseFirestore.collection("users").document(mFirebaseAuth.getCurrentUser().getUid());
documentReference.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            String sex = document.getString("sex");
            Log.d("", "Cached document data: " + document.getData());
            // 所有用到sex值的逻辑都放到回调内部执行
            Toast.makeText(getContext(), "Gender :" + sex, Toast.LENGTH_SHORT).show();
            Query query = null;
            if ("Male".equals(sex)) {
                query = firebaseFirestore.collection("Female");
            } else if ("Female".equals(sex)) {
                query = firebaseFirestore.collection("Male");
            } else {
                query = firebaseFirestore.collection("Others");
            }
            // 后续使用query的逻辑也写在这里
        } else {
            Log.d("TAG", "Cached get failed: ", task.getException());
        }
    }
});
解决方案2:自定义接口回调传递结果

如果你的逻辑需要拆分到不同方法中,可以自定义回调接口来接收异步返回的结果:
首先定义回调接口:

public interface OnSexFetchListener {
    void onSuccess(String sex);
    void onFailure(Exception e);
}

封装获取性别的方法:

private void fetchUserSex(OnSexFetchListener listener) {
    DocumentReference documentReference = firebaseFirestore.collection("users").document(mFirebaseAuth.getCurrentUser().getUid());
    documentReference.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                String sex = task.getResult().getString("sex");
                listener.onSuccess(sex);
            } else {
                listener.onFailure(task.getException());
            }
        }
    });
}

调用时传入回调实现即可:

fetchUserSex(new OnSexFetchListener() {
    @Override
    public void onSuccess(String sex) {
        Toast.makeText(getContext(), "Gender :" + sex, Toast.LENGTH_SHORT).show();
        Query query = null;
        if ("Male".equals(sex)) {
            query = firebaseFirestore.collection("Female");
        } else if ("Female".equals(sex)) {
            query = firebaseFirestore.collection("Male");
        } else {
            query = firebaseFirestore.collection("Others");
        }
        // 处理后续逻辑
    }

    @Override
    public void onFailure(Exception e) {
        Log.d("TAG", "获取性别失败: ", e);
    }
});

内容的提问来源于stack exchange,提问作者robin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:57:03