我遇到了问题,但不知道如何解决。我正在自学 Android,现在我正在使用抽屉导航与我的应用程序的一部分进行交互。我想要的是,当我从 NavigationActivity
中选择 questionItem
时,我想根据 Firebase Firestore 中存储的 boolean 变量返回一个 View
。我知道 Firebase 上的查询是异步的,这就是为什么始终返回 no_question 布局的原因,即使存储的变量的值是 true 也是如此。但我不知道如何解决它,如果有人帮助我找到解决方案,我将非常感激。我尝试了很多解决方案,例如使用线程同步或 hibernate 主线程,但它不起作用。
这是我的代码:
public class QuestionFragment extends Fragment {
private View root;
private boolean[] question_act = new boolean[1];
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
isQuestion_act(new Callback() {
@Override
public void activacioRebuda(final boolean qNova) {
question_act[0] = qNova;
}
});
if (question_act[0]) root = inflater.inflate(R.layout.fragment_question, container, false);
else root = inflater.inflate(R.layout.fragment_noquestion, container, false);
return root;
}
public interface Callback {
void activacioRebuda(final boolean question);
}
private void isQuestion_act(Callback callback) {
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
assert user != null;
String id = user.getUid();
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("players")
.whereEqualTo("Id", id).whereEqualTo("Question_act", true)
.get()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
Log.d(TAG, document.getId() + " => " + document.getData());
boolean q = document.getBoolean("Question_act");
Log.d(TAG, " question " + q);
if (callback != null) {
callback.activacioRebuda(q);
}
}
} else {
Log.w(TAG, "Error getting documents.", task.getException());
Toast.makeText(getActivity(), "User does not exist", Toast.LENGTH_SHORT).show();
}
});
}
}
最佳答案
简单地分配question_act[0] = qNova;
没有任何区别。正如您在问题中已经提到的,Firebase API 是异步的,因此在回调之外使用 qNova
的值将永远工作。
您唯一的选择是仅在 activacioRebuda()
方法中使用 qNova
的值来等待数据,因为您非常确定从数据库获取数据的操作已100%完成。
要获得有效的解决方案,请参阅以下帖子中我的回答:
关于java - 如何根据 boolean 变量决定抽屉导航 fragment 的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60999215/