2016-08-17 2 views
1

Je sais qu'il existe déjà de nombreux problèmes dans StackOverflow. Mais je n'ai trouvé aucun d'entre eux résolu mon problème.Exception non interceptée dans Fireloase runloop (3.0.0) Dans mon application Android de production. S'il vous plaît signaler à [email protected]

Mon application Android est en production et je reçois cette erreur presque tous les jours de mon utilisateur.

Fatal Exception: java.lang.RuntimeException: Uncaught exception in Firebase runloop (3.0.0). Please report to [email protected] 
    at com.google.android.gms.internal.zzagf$1$1.run(Unknown Source) 
    at android.os.Handler.handleCallback(Handler.java:815) 
    at android.os.Handler.dispatchMessage(Handler.java:104) 
    at android.os.Looper.loop(Looper.java:194) 
    at android.app.ActivityThread.main(ActivityThread.java:5763) 
    at java.lang.reflect.Method.invoke(Method.java) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
Caused by java.util.ConcurrentModificationException 
    at java.util.HashMap$HashIterator.remove(HashMap.java:805) 
    at bvi.l(:com.google.android.gms.DynamiteModulesC:648) 
    at bvi.a(:com.google.android.gms.DynamiteModulesC:388) 
    at buw.a(:com.google.android.gms.DynamiteModulesC:82) 
    at buw.a(:com.google.android.gms.DynamiteModulesC:4199) 
    at bvz.b(:com.google.android.gms.DynamiteModulesC:226) 
    at bvz.a(:com.google.android.gms.DynamiteModulesC:271) 
    at bwg.run(:com.google.android.gms.DynamiteModulesC:1020) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:818) 

Ce problème est vraiment ennuyeux et il pourrait également me causer la perte d'utilisateurs.

Mon build.gradle:

compile 'com.google.android.gms:play-services-auth:9.2.1' 
compile 'com.google.firebase:firebase-database:9.2.1' 
compile 'com.google.firebase:firebase-auth:9.2.1' 
compile 'com.google.firebase:firebase-invites:9.2.1' 
compile 'com.firebaseui:firebase-ui-database:0.4.0' 

NOTE: Je n'utilise pas Firebase rapport d'incidents, car il crée un autre processus qui peut aussi être la cause de ce défaut. Mais je ne sais pas pourquoi j'ai toujours ce défaut.

J'ai déjà demandé à la communauté lâche à ce sujet. On dirait qu'ils ne sont pas capables de m'aider parce que le code est obscurci.

Voici mon lien d'application: 2048 Live

+0

utilisez-vous l'opération de transaction dans votre application? – Wilik

+0

@Wilik, oui. Il y a beaucoup d'endroits dans mon application qui aiment ou ne aiment pas un jeu, gagner un jeu ou perdre un jeu, etc. Dans ce cas j'ai besoin des données de serveur précédentes, manipulez et mettez à jour. Donc transaction. –

+0

J'ai supprimé le lien Crashlytics car cela pourrait entraîner la fermeture de la question comme trop localisée ou non autonome. Je suis d'accord qu'une trace de pile serait bien - s'il vous plaît coller le bit pertinent dans la question comme un bloc de texte formaté. Merci. – halfer

Répondre

1

Si vous utilisez la méthode de transaction, l'erreur se produit si l'utilisateur tape le bouton à plusieurs reprises (la création de plusieurs demandes de transaction) et dans un court laps de temps avant que la transaction précédente terminée.

J'ai eu le même problème et ma solution dans mon application est en évitant la méthode de transaction si l'opération peut être effectuée dans un court laps de temps.

Ou vous pouvez désactiver le bouton et l'activer lorsque la transaction précédente est terminée ou empêcher l'utilisateur d'abuser du bouton.

private void onLikeButtonClicked() { 
    likeButton.setEnabled(false); 
    ref.runTransaction(new Transaction.Handler() { 
     @Override 
     public Transaction.Result doTransaction(MutableData mutableData) { 
      // transaction operation 
      return Transaction.success(mutableData); 
     } 

     @Override 
     public void onComplete(DatabaseError databaseError, boolean b, 
           DataSnapshot dataSnapshot) { 
      likeButton.setEnabled(true); 
     } 
    }); 
} 

J'espère que vous comprenez mon explication, espérons que cette aide :)

+0

Cela est déjà pris en charge. Il y a aussi d'autres situations dans mon application, où je dois faire des transactions plusieurs fois. Par exemple: lorsqu'un utilisateur gagne un défi, des points de récompense doivent être ajoutés et déduits des comptes respectifs. Aussi bien que j'ai besoin de mettre à jour les détails de gagnant et les comptes gagnants aussi. Donc, c'est presque 4 transactions dans le code et cela devrait être fait. –

+0

pouvez-vous poster le code simplifié de ces transactions? Peut-être que nous pouvons trouver un meilleur moyen de réaliser ce que vous voulez. et essayez également de mettre à jour votre bibliothèque Firebase vers 9.4.0 et firebase-ui vers 0.4.4 – Wilik

+0

Cela se produit aussi dans 9.4.0 – Makalele

0

Cela se produit lorsque vous activez le stockage persistant. Et il semble qu'ils doivent encore le réparer. Mais si vous désactivez le stockage persistant, vous ne verrez plus ce problème.

//FirebaseDatabase.getInstance().setPersistenceEnabled(true); 

Commentez cette ligne et cela fonctionnera. Cela arrive à la suite d'une base de données corrompue stockée localement.