2010-07-12 8 views
6

J'utilise Google Analytics pour Android pour suivre des événements, des pages vues sur une application Android. Lorsque vous appelez la méthode d'expédition de suivi, je reçois un RuntimeException:RuntimeException de Google Analytics pour Android "envoi de message à un gestionnaire sur un thread mort"

07-12 18:02:05.594: WARN/MessageQueue(12823): Handler{44a08620} sending message to a Handler on a dead thread 
07-12 18:02:05.594: WARN/MessageQueue(12823): java.lang.RuntimeException: Handler{44a08620} sending message to a Handler on a dead thread 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:179) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at android.os.Handler.sendMessageAtTime(Handler.java:457) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at android.os.Handler.sendMessageDelayed(Handler.java:430) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at android.os.Handler.post(Handler.java:248) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.google.android.apps.analytics.NetworkDispatcher$DispatcherThread.dispatchEvents(Unknown Source) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.google.android.apps.analytics.NetworkDispatcher.dispatchEvents(Unknown Source) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.google.android.apps.analytics.GoogleAnalyticsTracker.dispatch(Unknown Source) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.company.activity.set(MyActivity.java:177) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.company.activity.access$34(MyActivity.java:175) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.company.activity.$45.onClick(MyActivity.java:1982) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at android.os.Looper.loop(Looper.java:123) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-12 18:02:05.594: WARN/MessageQueue(12823):  at dalvik.system.NativeStart.main(Native Method) 

--EDIT-- Au début, j'étais convaincu qu'il fallait faire avec mon stage de suivi, le mettre dans onResume, fils, etc. magie fait le jeter des exceptions. Il s'avère, Google's own example code (également disponible dans leur SDK téléchargement) jette également cette exception:

>07-12 23:47:09.343: WARN/MessageQueue(18468): null sending message to a Handler on a dead thread 
07-12 23:47:09.343: WARN/MessageQueue(18468): java.lang.RuntimeException: null sending message to a Handler on a dead thread 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:179) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.os.Looper.quit(Looper.java:173) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at com.google.android.apps.analytics.NetworkDispatcher.stop(Unknown Source) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at com.google.android.apps.analytics.NetworkDispatcher.init(Unknown Source) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at com.google.android.apps.analytics.GoogleAnalyticsTracker.start(Unknown Source) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at com.google.android.apps.analytics.GoogleAnalyticsTracker.start(Unknown Source) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at com.google.android.apps.analytics.GoogleAnalyticsTracker.start(Unknown Source) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at com.google.android.apps.analytics.sample.AnalyticsSample.onCreate(AnalyticsSample.java:23) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3815) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.app.ActivityThread.access$2400(ActivityThread.java:125) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2037) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.os.Looper.loop(Looper.java:123) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-12 23:47:09.343: WARN/MessageQueue(18468):  at dalvik.system.NativeStart.main(Native Method) 

Cela se produit lorsque vous forcez l'activité initiale à détruire (par exemple changement d'orientation, aller à l'écran d'accueil, etc.). Je ne peux pas stocker l'objet tracker d'origine via onSavedInstance, car tracker n'est pas un objet Parcelable. D'autres idées, des indices sur comment se débarrasser de cette erreur?

--EDIT-- Plus étrange encore, il semble que cela provoque aussi le problème suivant:

>07-13 00:50:02.581: WARN/googleanalytics(27605): Dispatcher thinks it finished, but there were -4 failed events 

Alors que mentionne la plupart de cette ligne pointent du doigt retour à dans les événements des espaces blancs ou PageViews qui corrompt le DB, j'ai confirmé que ce ne soit pas le cas. En outre, je ne suis pas sûr de ce que cela signifie d'avoir un événement négatif (-4)!

+1

J'utilise GA dans Android depuis un certain temps maintenant, sans cette question, étrange. J'ai lu des plaintes sur le web à propos de problèmes similaires. Avez-vous essayé de l'exécuter dans un service? Kinda overkill, mais si ça aide ... Pour le compte rendu, je l'envoie sur onPause() et je n'ai aucun problème. Je ne recommanderais pas d'envoyer dans onResume(), car AFAIK l'horodatage des événements GA pourrait être désactivé (le temps est pris lorsque l'événement est envoyé, pas quand il est enregistré). –

Répondre

1

Vous pouvez faire une dépêche en OnPause()

tracker.dispatch(); 

pour éviter de perdre des données puis recréent le tracker

Questions connexes