Monodroid - GC.Collect не работает без причины - PullRequest
0 голосов
/ 29 сентября 2011

У меня есть приложение с 4 вкладками (TabActivity).По некоторым причинам я вызываю GC.Collect каждый раз, когда пользователь переключает вкладку (переопределяя метод OnPause Activity).Иногда (примерно 1 раз из 50-100 вызовов, но иногда это происходит, когда приложение только что запущено) мое приложение зависает в этот момент.

Вот часть моего кода:

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;
  }
}

ИВот соответствующий вывод журнала 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>

Никаких исключений не было, нет видимых причин сбоя.Приложение просто зависает, через несколько секунд я получаю предупреждение ОС Android: «Оппс, ваше приложение застряло. Принудительно закрывать или ждать?»

Кто-нибудь сталкивался с этим?

Ответы [ 2 ]

0 голосов
/ 26 июля 2012

Необходимость выполнения GC.Collect () при любых обстоятельствах является неприятным запахом кода. Выясните основную причину и выполните корректирующую реархитектуру.

0 голосов
/ 26 января 2012

В некоторых старых версиях monodroid была ошибка: если вы вызываете GC.Collect и HTTP-запрос в параллельных потоках, это вызывало сбой. Обновление до последней версии monodroid.

...