我正在为自己的学习构建社交应用程序,必须使用Firebase firestore来存储有关我的应用程序的一些信息。
我的问题很简单,但是我不明白为什么会有这个问题。 用户创建活动时,也会创建聊天和欢迎消息。 但是我的方法(因此我的firebase请求)被调用了两次。
private void createAct(SharedActivity SharedAct) {
ActivityHelper.createActivities(SharedAct.getId(), SharedAct.getTitle(), SharedAct.getDescription(), SharedAct.getAdress(), SharedAct.getDate(), SharedAct.getPicture(), SharedAct.getMaxPartner(), SharedAct.getType(), SharedAct.getUserId()).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
createWelcomeMess(SharedAct);
}
});
}
/**
* To generate a new message in the new activity
* To launch the discussion in the activity
*/
private void createWelcomeMess(SharedActivity activityCreated) {
if (!activityAlreadyCreated){
MessageHelper.createMessageForChat("Bienvenue dans le chat de discussion", activityCreated.getId(), user).addOnSuccessListener(documentReference -> {
Toast.makeText(getActivity(), "Votre Activité est bien crée", Toast.LENGTH_SHORT).show();
Log.i(TAG, "onSuccess: message created");
activityAlreadyCreated = true;
new Handler().postDelayed(() -> {
MainDashBoardFragment fragment = new MainDashBoardFragment();
Bundle bundle = new Bundle();
bundle.putString("id", ID);
fragment.setArguments(bundle);
getParentFragmentManager().beginTransaction().add(R.id.main_frame_layout, fragment).addToBackStack("frag").commit();
}, 1000);
});
}
能否给我一些解释以及如何解决此问题?
我已经尝试过的内容:
private void createWelcomeMess(SharedActivity activityCreated) {
if (!activityAlreadyCreated){
MessageHelper.createMessageForChat("Bienvenue dans le chat de discussion", activityCreated.getId(), user).addOnSuccessListener(documentReference -> {
Toast.makeText(getActivity(), "Votre Activité est bien crée", Toast.LENGTH_SHORT).show();
Log.i(TAG, "onSuccess: message created");
activityAlreadyCreated = true;
new Handler().postDelayed(() -> {
MainDashBoardFragment fragment = new MainDashBoardFragment();
Bundle bundle = new Bundle();
bundle.putString("id", ID);
fragment.setArguments(bundle);
getParentFragmentManager().beginTransaction().add(R.id.main_frame_layout, fragment).addToBackStack("frag").commit();
}, 1000);
});
}
答案 0 :(得分:0)
您可以尝试快照侦听器吗?正如文档所述,它假定仅触发一个。在实时数据库中,我遇到了同样的问题。然后我将常规侦听器切换为singleEventListener,它开始仅触发一个。因此,除了Firestore之外,它等效于singleEventListener。我试图避免使用Firestore,因为它为每次读/写/更新收取很多费用,这就是为什么Im仅在Firestore中仅存储用户数据,而这些数据是常规数据,但实时保留了信息。
这是代码示例
query.addSnapshotListener(
new EventListener<QuerySnapshot>() {
// ...
});