J'ai le morceau de code suivant:

FirebaseDatabase database = FirebaseDatabase.getInstance();
imgScanStatus = database.getReference().child("imgScanStatus");
imgScanStatus.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        Map<String, Object> scanStatus = (Map<String, Object>) dataSnapshot.getValue();
                        if(scanStatus.get("isFinishedScanning").equals(true)){
                            downloadFile(ScanResult.this, "scan", ".txt", DIRECTORY_DOWNLOADS, url);
                        }
                    }
                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

Chaque fois qu'il y a un changement de données dans la base de données, le code vérifie si isFinishedScanning est vrai, s'il est satisfait, il télécharge un fichier. Cela fonctionne très bien. Maintenant, quand je lance à nouveau l'application, la prochaine fois, elle télécharge 2 du même fichier. Lors de la troisième exécution, il télécharge 3 du même fichier et ainsi de suite. Je suppose que c'est parce que la méthode enregistre le nombre cumulé de modifications de données, ce qui signifie que la valeur de isFinishedScanning a été définie sur true un total de 3 fois la troisième fois que j'exécute la fonction dans l'application. Comment le configurer pour qu'il vérifie la valeur et ne télécharge le fichier qu'une seule fois, peu importe le nombre de fois que j'exécute l'application?

Voici ma structure de base de données: entrez la description de l'image ici

0
turing042 16 sept. 2020 à 08:38

2 réponses

Meilleure réponse

Vous devez faire en sorte que chaque appel à addValueEventListener soit associé à un appel à removeEventListener pour supprimer l'auditeur qui a été ajouté. Si vous ajoutez un écouteur et ne le supprimez pas lorsque vous avez terminé, il continuera à écouter et à recevoir des rappels jusqu'à ce que le processus d'application meure. Cette suppression ne se produit pas automatiquement lorsque l'utilisateur quitte l'écran - vous devrez écrire votre code pour gérer cela. Vous souhaiterez peut-être utiliser le cycle de vie Android pour gérer correctement l'écouteur.

0
Doug Stevenson 16 sept. 2020 à 06:36

Monsieur, vous devez utiliser le addChildEventListener. Dans ce cas, chaque fois qu'un nouveau fichier est ajouté dans votre nœud, il déclenchera uniquement la méthode onChildAdded et vous donnera les données ajoutées.

DatabaseReference myFirebaseRef = database.getReference("Your firbase path");
myFirebaseRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    /*
      here you can get your new added file . Write your logic for download the file 
    */
     }
    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) 
     {

    }
    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
0
Hasnain Sabir 16 sept. 2020 à 08:26