2011-09-29 6 views
0

J'ai une application avec 4 onglets (TabActivity). Pour certaines raisons, j'appelle GC.Collect chaque fois que l'utilisateur change d'onglet (remplaçant la méthode de l'OnPause Activity). Parfois (environ 1 fois de 50 à 100 appels, mais parfois cela arrive lorsque l'application vient de démarrer) mon application se bloque dans ce moment.Monodroid - GC.Collect échoue sans raison

Voici une partie de mon code:

protected override void OnPause(){ 
    base.OnPause(); 

    try{ 
    Android.Util.Log.Info("----","GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);"); 
    GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); 
    Android.Util.Log.Info("----","GC.Collect Finished"); 
    }catch(Exception exc){ 
    Android.Util.Log.Info("exc.Message",exc.Message); 
    Android.Util.Log.Info("exc.StackTrace",exc.StackTrace); 
    throw exc; 
    } 
} 

Et voici la sortie correspondante du journal Android

//Previous GC.Collect call, it's all ok 
I/---- (7796): GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); 
D/dalvikvm(7796): GetMethodID: method not found: Landroid/widget/EditText;.monodroidAddReference:(Ljava/lang/Object;)V 
D/dalvikvm(7796): GC_EXPLICIT freed 962 objects/42472 bytes in 112ms 
I/---- (7796): GC.Collect Finished 
//On another call fails 
I/---- (7796): GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); 
I/mono (7796): Stacktrace: 
I/mono (7796): 
I/mono (7796): at System.GC.Collect (int) <0x0001f> 
I/mono (7796): at System.GC.Collect (int,System.GCCollectionMode) <0x00017> 
I/mono (7796): at PixelsAndroid.CustomActivity.OnPause() <0x00067> 
I/mono (7796): at Android.App.Activity.n_OnPause (intptr,intptr) <0x00037> 
I/mono (7796): at (wrapper dynamic-method) object.908cefd4-40eb-4dd1-97cd-f731b2ada74a (intptr,intptr) <0x0002b> 
I/mono (7796): at (wrapper native-to-managed) object.908cefd4-40eb-4dd1-97cd-f731b2ada74a (intptr,intptr) <0xffffffff> 

Aucune exception à été lancée, aucune raison apparente à l'échec. Application se bloque, après quelques secondes, je reçois l'alerte Android OS: "Oppps, votre application est coincée.Force fermer ou attendre?"

Quelqu'un est-il confronté?

+1

Pourquoi appelez-vous GC.Collect() en premier lieu? Je n'ai jamais eu une raison valable de forcer un GC sur MonoDroid ou Windows d'ailleurs. Quand je vois GC.Collect(), c'est une odeur de code qui doit être repensée. –

+0

Je l'utilise comme une solution particulière de [ce problème] (http://stackoverflow.com/questions/7603135/monodroid-passing-data-to-listview-according-to-gref-limit) – PVoLan

+0

Réduire le nombre d'instances vous chargez. Soyons francs: si votre code charge autant d'éléments de liste que vous atteignez la limite GREF (c'est-à-dire que vous ne paginez pas les données), alors vous devez revoir votre solution. Rappelez-vous, c'est un appareil mobile et non votre ordinateur portable/bureau/quoi que ce soit. –

Répondre

0

Il y avait un bug dans certaines anciennes versions de monodroid: si vous appelez GC.Collect et une requête http dans un thread parallèle, cela a causé un plantage. Mise à jour vers une dernière version de monodroid.

0

Avoir à faire un GC.Collect() dans n'importe quelle circonstance est une mauvaise odeur de code. Déterminez la raison sous-jacente et effectuez une recherche corrective.