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
相关产品推荐
相关产品推荐

