System.GC不适用于create方法

时间:2017-12-03 20:03:21

标签: java android xamarin

我使用System.GC(GC.CollectorOn xamarin)清除垃圾收集器。 但不幸的是,在我将打开活动五次以上后,我将得到错误的Java.Lang.outof内存。为什么会这样? System.GC没有点击动态我所有的垃圾收集器?这是我的代码:

protected override void OnCreate(Bundle savedInstanceState) {
    base.OnCreate(savedInstanceState);
    RequestWindowFeature(WindowFeatures.NoTitle);
    SetContentView(Resource.Layout.CatalogItem);
    imageview = FindViewById < ImageView > (Resource.Id.ItemImageView);

    GC.Collect();
    GC.WaitForPendingFinalizers();
    dpPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "student.db3");
    db = new SQLiteConnection(dpPath);
    var table = db.Query < CatalogItemClass > ("select  ItemImg,_id,InventoryItemName,InventoryItemPrice from CatalogItemClass where CategoryID=1  ");

    foreach(var item in table) {
        Image = item.ItemImg;
    }

    if (Image != null) {
        Bitmap decodedByte = BitmapFactory.DecodeByteArray(Image, 0, Image.Length);
        imageview.SetImageBitmap(decodedByte);
    }
}

4 个答案:

答案 0 :(得分:3)

  

但不幸的是,在我将打开活动五次以上后,我将得到错误的Java.Lang.outof内存。

正如@elmorabea所说,有些东西会泄漏内存,内存泄漏会导致可用Heaps触发GC频繁的次数越来越少,但是可以&#39 ; t回收这些资源,最后OOM发生了。在这种情况下,执行GC无法帮助您。

  

因此,当我按下后按i运行FinishAffinity。然后在下一个活动中运行system.gc

您已销毁导致内存泄漏的对象,以便GC可以再次运行。您可以使用Android Device Monitor来查找泄漏内存的对象:

enter image description here

enter image description here

解决方案:

  1. 解决您的内存泄漏问题。
  2. 高效加载位图。
    • 您可以阅读此document,此配方将向您展示如何将大型图像加载到内存中,而不会让应用程序通过在内存中加载较小的子采样版本来抛出OutOfMemoryException
  3. 建议:

    将图像存储到Sqlite数据库不是最佳做法,您可以将图像存储在存储中,将它们设为私有,然后将它们保存在应用程序文件夹中并保存数据库的路径。

    然后你可以使用像GlidePicasso这样的库加载图像,加载图像时它们做得很好。正如他们的文档所说,Android的快速高效图像加载,它们可以帮助您解决OOM问题。

答案 1 :(得分:0)

除非您需要,否则请勿清除垃圾收集器。 Android会为你做自动垃圾收集。

Source

答案 2 :(得分:0)

首先,垃圾回收器调用它的方法,更多的是你希望GC运行的提示,没有实际保证它会立即运行。

其次,如果您有泄漏内存的东西,例如线程保持视图实例,或类似的东西,GC将无法帮助您。

请查看here以进一步了解内存泄漏。

在其他一些情况下,它可能不是泄漏,也可能是您正在加载的图像太大了。在这种情况下,您应该使用像Picasso或Glide这样的库并使用它们的缩放功能。 或者您可能希望在加载图像之前查看一个很好的属性来缩放图像。 inJustDecodeBounds

答案 3 :(得分:0)

我发现我的答案是运行垃圾收集器的唯一方法,工作就是关闭你在活动中使用的所有元素。所以当我按下后按我运行FinishAffinity。然后在下一个活动中我运行系统.gc