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é.
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!
De combien d'itérations de boucle parlez-vous exactement ici? –
À l'heure actuelle, il y a moins de 10 tâches dans chacune. Mais peut être beaucoup plus lorsqu'il est libéré. – Tappyy
Vous utilisez 'addValueEventListener()', ce qui laisse l'écouteur attaché. Devriez-vous utiliser 'addListenerForSingleValueEvent()' à la place? –