0

Je rencontre un problème lors de la tentative de mise à jour de plusieurs chemins après la mise en boucle des requêtes.Android Firebase - Boucler et mettre à jour plusieurs chemins/requêtes. Déclenche la collecte des ordures?

Voici une maquette en place rapide de ma base de données:

Subjects/ 
    - subjectId/ 
     - subjectName 
     - subjectColor 

Tasks/ 
    - taskId/ 
     - taskTitle 
     - taskDesc 
     - subjectId 
     - subjectName 
     - subjectColor 

SubjectTasks/ 
    - taskId/ 
     - taskTitle 
     - taskDesc 
     - subjectId 
     - subjectName 
     - subjectColor 

J'ai une activité dans mon application où les utilisateurs peuvent modifier le nom et la couleur des sujets. Afin de mettre à jour les subjectName et subjectColor propriétés des tâches avec une valeur subjectId correspondant à celui que nous avons édité que je dois faire tout un tas d'interrogation et une boucle à travers les nœuds Tasks et subjectTasks. C'est là que se produit le coup majeur de performance (je pense!)

C'est cette lourde opération de bouclage et d'écriture qui, selon moi, provoque le déclenchement de la récupération de place, interrompant tous les threads, envoyant mon application dans un écran de chargement indéterminé.

GC triggered Collecte des ordures ménagères déclenché lorsque le sujet est édité et enregistré :(

Après de nombreuses heures à étudier le tas et le profileur de mémoire dans Android Studio Je n'ai pas d'autres idées autres que l'affichage ici. Il est plus ennuyeux que cela a été trouvé quelques jours avant la sortie

Voici l'extrait de code de l'activité où l'écriture du sujet se produit édité:

private void WriteEditedSubject(final String uid, final String subjectName, final String primaryColour, int swatchId){ 

    final DatabaseReference rootRef = mDatabase.getRef(); 

    SubjectItem editedSubject = new SubjectItem(subjectName, primaryColour, swatchId); 
    editedSubject.setUid(subjectId); 

    //create map of edited values 
    Map<String, Object> subjectValues = editedSubject.toMap(); 

    //create map of updates to push 
    final Map<String, Object> subjectUpdates = new HashMap<>(); 

    //update subjects node 
    subjectUpdates.put("/subjects/" + uid + "/" + subjectId, subjectValues); 

    //push updates 
    rootRef.updateChildren(subjectUpdates); 

    //todo: run a cloud function to update subject tasks and subjects using data from updated subject 

    //update subject tasks node where tasks match subjectId 
    mSubjectTasks.orderByChild("subjectId").equalTo(subjectId).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      //create map of updates to push 
      Map<String, Object> subjectTaskUpdates = new HashMap<>(); 

      for(DataSnapshot taskShot : dataSnapshot.getChildren()){ 
       TaskItem task = taskShot.getValue(TaskItem.class); 

       if(task != null) { 
        task.setSubjectName(subjectName); 
        task.setSubjectPrimaryColour(primaryColour); 

        Map<String, Object> taskValues = task.toMap();      

        subjectTaskUpdates.put("subjectTasks/" + uid + "/" + subjectId + "/" + task.getUid(), taskValues); 
       } 

      } 

      rootRef.updateChildren(subjectTaskUpdates); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    //update tasks node where tasks match subjectId 
    mTasks.orderByChild("subjectId").equalTo(subjectId).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      //create map of updates to push 
      Map<String, Object> taskUpdates = new HashMap<>(); 

      for(DataSnapshot taskShot : dataSnapshot.getChildren()){ 
       TaskItem task = taskShot.getValue(TaskItem.class); 
       if(task != null) { 
        task.setSubjectName(subjectName); 
        task.setSubjectPrimaryColour(primaryColour); 

        Map<String, Object> taskValues = task.toMap(); 

        taskUpdates.put("tasks/" + uid + "/" + task.getUid(), taskValues); 

       } 

      } 

      rootRef.updateChildren(taskUpdates); 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

Y a-t-il un moyen de nettoyer cette opération et de la rendre plus efficace? Une idée que j'avais était d'écrire une fonction de nuage qui se déclencherait lorsque le sujet est édité mais je suis déterminé à découvrir pourquoi cela se produit.

Merci pour toute aide. Très appréciée!

+0

De combien d'itérations de boucle parlez-vous exactement ici? –

+0

À l'heure actuelle, il y a moins de 10 tâches dans chacune. Mais peut être beaucoup plus lorsqu'il est libéré. – Tappyy

+0

Vous utilisez 'addValueEventListener()', ce qui laisse l'écouteur attaché. Devriez-vous utiliser 'addListenerForSingleValueEvent()' à la place? –

Répondre

0

On dirait que ce que Bob Snyder a indiqué était correct.

Le remplacement de AddValueEventListener par AddListenerForSingleEvent a permis de résoudre le problème.