【问题标题】:addsnapshotlistener triggers even though there is no update in Firebase即使 Firebase 中没有更新,也会添加快照侦听器触发器
【发布时间】:2021-06-04 00:13:16
【问题描述】:

在我的应用程序中,homepage 活动包含一个分段的recyclerview,其中的值是通过查询 Firebase 来启动的。数据检索和recyclerview 起初运行良好。

然后,我尝试实现addsnapshotlistener 自动更新我的活动,而不需要用户独立刷新页面。

但是,当我运行我的代码时,recyclerview 重复了相同的部分 recyclerview 两次。

这是我的活动的代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getSupportActionBar().hide();
    setContentView(R.layout.homepage);

    mAuth = FirebaseAuth.getInstance();
    db = FirebaseFirestore.getInstance();
    ///storageRef = FirebaseStorage.getInstance().getReference();
    FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
    UserId = FirebaseAuth.getInstance().getCurrentUser().getUid();

    MainRecyclerView = findViewById(R.id.MainContainer);
    SignoutButton = findViewById(R.id.SignOutbutton);

    checkUserType();

    SignoutButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseAuth.getInstance().signOut();
            ///mAuth.GoogleSignInApi.signOut(apiClient);
            Intent i = new Intent(HomePage.this, Login.class);
            startActivity(i);
        }
    });

    ///queries data from firebase
    initData();

    BottomNavigationView bottomNavigationView = findViewById(R.id.bottomNavigationView);
    bottomNavigationView.setSelectedItemId(R.id.appointment);

    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            switch (item.getItemId()){
                case R.id.search:
                    startActivity(new Intent(getApplicationContext(),Search.class));
                    overridePendingTransition(0,0);
                    return true;
                case R.id.appointment:
                    return true;
                case R.id.profile:
                    startActivity(new Intent(getApplicationContext(),Profile.class));
                    overridePendingTransition(0,0);
                    return true;
            }
            return false;
        }
    });

    UpdateToken();
}

@Override
protected void onStart() {
    super.onStart();

    sectionList.clear();
    apnmntList.clear();

    CollectionReference colref = db.collection("appointmentsColl").document(UserId)
            .collection("Date");

    ///check for updates inside of the collections
    HPListener= colref.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
            for (QueryDocumentSnapshot document : value) {

                ///query all the values again
                db.collection("appointmentsColl").document(UserId)
                        .collection("Date").document(document.getId())
                        .collection("appointmentsID")
                        .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        apnmntList = new ArrayList();

                        for (DocumentSnapshot querysnapshot: task.getResult()){

                            apnmtDetails details = new apnmtDetails(
                                    querysnapshot.getString("customer name"),
                                    querysnapshot.getString("barberID"),
                                    querysnapshot.getString("shop name"),
                                    querysnapshot.getString("name"),
                                    querysnapshot.getString("type"),
                                    querysnapshot.getString("status"),
                                    querysnapshot.getString("price"),
                                    querysnapshot.getString("time slot"));

                            apnmntList.add(details);
                            section = new Section(document.getString("date"),apnmntList);

                        }

                        ///notify recyclerview
                        sectionList.add(section);
                        mainRecyclerAdapter.notifyDataSetChanged();
                    }

                });
            }
        }
    });

}

@Override
protected void onStop() {
    super.onStop();
    HPListener.remove();
}

private void checkUserType() {
    DocumentReference docRef = db.collection("Users").document(UserId);
    docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(@Nullable DocumentSnapshot value, @Nullable FirebaseFirestoreException error) {
            if (value.exists()) {
                userType = "Users";
            } else {
            userType = "Barbers";
            }
        }
    });

}

private void initData(){

    db.collection("appointmentsColl").document(UserId)
            .collection("Date")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : task.getResult()) {

                            ///getting the list of appointments and their details
                            db.collection("appointmentsColl").document(UserId)
                                    .collection("Date").document(document.getId())
                                    .collection("appointmentsID")
                                    .get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                    apnmntList = new ArrayList();
                                    for (DocumentSnapshot querysnapshot: task.getResult()){

                                        apnmtDetails details = new apnmtDetails(
                                                querysnapshot.getString("customer name"),
                                                querysnapshot.getString("barberID"),
                                                querysnapshot.getString("shop name"),
                                                querysnapshot.getString("name"),
                                                querysnapshot.getString("type"),
                                                querysnapshot.getString("status"),
                                                querysnapshot.getString("price"),
                                                querysnapshot.getString("time slot"));

                                        ///adding appointmnets into an arraylist
                                        apnmntList.add(details);

                                        ///saving the value of the section title and the appointments arraylist inside one object
                                        section = new Section(document.getString("date"),apnmntList);

                                    }

                                    ////initializing a new array list with the section's objects
                                    sectionList.add(section);

                                    ///initializes the main recyclerview
                                    LinearLayoutManager manager = new LinearLayoutManager(HomePage.this);
                                    manager.setReverseLayout(true);
                                    manager.setStackFromEnd(true);
                                    MainRecyclerView.setLayoutManager(manager);
                                    MainRecyclerView.setAdapter(mainRecyclerAdapter);
                                }

                            });
                        }

                    }else{

                        Toast.makeText(HomePage.this,"failed",Toast.LENGTH_SHORT).show();
                    }
                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.i("Check", e.toString() );
        }
    });

}

private void UpdateToken() {

    FirebaseUser firebaseUser= FirebaseAuth.getInstance().getCurrentUser();
    String refreshToken= FirebaseInstanceId.getInstance().getToken();
    Token token= new Token(refreshToken);
    FirebaseDatabase.getInstance().getReference("Tokens").child(FirebaseAuth.getInstance().getCurrentUser().getUid()).setValue(token);
}

这是我的输出在实施addsnapshotlistener: 前后的样子

之前

之后

我对@9​​87654333@进行了一段时间的修改,因为我不确定是否是问题的原因,所以我尝试将addsnapshotlistener中的方法替换为:

finish();

startActivity(getIntent()

我认为这会起作用,但是当我尝试运行我的代码时,主页开始无休止地自我刷新。

我试图搜索与我有同样问题的人,但我发现的帖子表明他们的 addsnapshotlistener 触发正确,但返回的数据实例是两倍。

当我打开我的活动时,该方法会自行触发,即使 Firebase 中没有更新,它也会自行触发。

如果有人可以帮助我解决这个问题,或者引导我找到任何可以帮助解决我的问题的链接或帖子,我将不胜感激。

【问题讨论】:

    标签: java firebase android-studio android-recyclerview google-cloud-firestore


    【解决方案1】:

    您提到您的数据检索一开始运作良好。你最近有什么改变吗?

    通过阅读您的代码,我无法看到您在哪里处理可能遇到的任何错误。由于安全设置更改或无效查询,侦听器可能会失败。

    如果您实现了错误回调以帮助您更好地了解发生了什么,这将有所帮助。例如,您可以将错误消息捕获为e 并输出错误。

    if (e != null) {
              System.err.println("Listen failed: " + e);
              return;
            }
    

    Documentation:

    db.collection("cities")
        .addSnapshotListener(new EventListener<QuerySnapshot>() {
          @Override
          public void onEvent(@Nullable QuerySnapshot snapshots,
                              @Nullable FirestoreException e) {
            if (e != null) {
              System.err.println("Listen failed: " + e);
              return;
            }
    
            for (DocumentChange dc : snapshots.getDocumentChanges()) {
              if (dc.getType() == Type.ADDED) {
                System.out.println("New city: " + dc.getDocument().getData());
              }
            }
          }
        });
    

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2019-03-22
      • 1970-01-01
      相关资源
      最近更新 更多