Monodroid - GC.Collect没有任何理由失败

时间:2011-09-29 15:32:03

标签: android mono xamarin.android

我有一个带有4个标签的应用程序(TabActivity)。由于某些原因,每次用户切换选项卡时都会调用GC.Collect(覆盖OnPause Activity的方法)。有时候(50-100次调用大约有1次,但有时会在应用程序启动时发生这种情况)我的应用程序暂时挂起。

以下是我的代码的一部分:

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操作系统警报:“Oppps,你的应用程序卡住了。强行关闭还是等待?”

有人面对吗?

2 个答案:

答案 0 :(得分:0)

在一些旧版本的monodroid中有一个错误:如果你在并行线程中调用GC.Collect和一个http请求,这会导致崩溃。更新到monodroid的最新版本。

答案 1 :(得分:0)

在任何情况下都必须执行GC.Collect()是一种糟糕的代码味道。找出根本原因并进行纠正性重建。