方法触发两次,但调用一次,Firebase请求

时间:2020-03-09 15:12:10

标签: java android firebase google-cloud-firestore android-lifecycle

我正在为自己的学习构建社交应用程序,必须使用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);
        });

    }

能否给我一些解释以及如何解决此问题?

我已经尝试过的内容:

  1. 在OnResume生命周期中初始化此方法。
  2. 更改Onclick方法(使用黄油刀)以使用基本的onclickListener监听onclick。
  3. 在创建消息后将一些布尔值标记出来
    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);
        });

    }

1 个答案:

答案 0 :(得分:0)

您可以尝试快照侦听器吗?正如文档所述,它假定仅触发一个。在实时数据库中,我遇到了同样的问题。然后我将常规侦听器切换为singleEventListener,它开始仅触发一个。因此,除了Firestore之外,它等效于singleEventListener。我试图避免使用Firestore,因为它为每次读/写/更新收取很多费用,这就是为什么Im仅在Firestore中仅存储用户数据,而这些数据是常规数据,但实时保留了信息。

这是代码示例

query.addSnapshotListener(
    new EventListener<QuerySnapshot>() {
        // ...
    });