Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 活动内存未清除_Android_Bitmap_Out Of Memory_Ram - Fatal编程技术网

Android 活动内存未清除

Android 活动内存未清除,android,bitmap,out-of-memory,ram,Android,Bitmap,Out Of Memory,Ram,出于某种原因,我的android应用程序在其活动完成时似乎没有正确释放BitmapFactory分配的空间。我的应用程序由两部分组成,一部分是缩略图查看器,第二部分是图像查看器。当按下缩略图时,图像查看器(主要是使用带有ImageView的片段的FragmentStatePagerAdapter)活动将启动。当退出图像查看器时,似乎所有当前加载到记忆棒中的位图都在附近,即使我事后调用System.gc() 我之所以认为是这样,是因为如果我重复进入一个图像的查看器,然后离开它,然后一遍又一遍地进入

出于某种原因,我的android应用程序在其活动完成时似乎没有正确释放BitmapFactory分配的空间。我的应用程序由两部分组成,一部分是缩略图查看器,第二部分是图像查看器。当按下缩略图时,图像查看器(主要是使用带有ImageView的片段的FragmentStatePagerAdapter)活动将启动。当退出图像查看器时,似乎所有当前加载到记忆棒中的位图都在附近,即使我事后调用System.gc()

我之所以认为是这样,是因为如果我重复进入一个图像的查看器,然后离开它,然后一遍又一遍地进入同一个图像,最终程序崩溃,说它内存不足。在有人指点我之前,我向你保证,这不是样本大小的问题。我可以安全地说,因为我可以加载相同的图像而没有问题,但是如果我尝试关闭它并再次加载足够的次数,那就是我得到OOM错误的时候

以前有人见过这样的问题吗?我尝试过手动卸载位图,但似乎我所做的一切都没有释放内存。有人能告诉我一些RAM分析工具或者告诉我如何手动清理这些位图吗


谢谢

首先,确保您正在缩放位图,并且位图本身不会太大,这是最重要的,内存泄漏就是泄漏,但是如果位图占用10mb,那么泄漏就不必担心了

为了正确地清理位图,我的例子是Xamarin Android,所以你需要做一些轻微的转换,但所有东西的名称都应该相同,你需要首先获得imageview或任何你有位图的容器,然后你需要获得可绘制的项目,接下来,你需要确保可绘制的是位图,然后,您需要检查该位图是否已回收,如果尚未回收,则需要将imageviews位图设置为null,重新设置位图的样式,清空位图,然后调用Java垃圾回收器,这就是代码对我的作用:

    public void CleanBitmap()
    {
        ImageView imageView = (ImageView)FindViewById(Resource.Id.myImage);
        Drawable drawable = imageView.Drawable;
        if (drawable is BitmapDrawable)
        {
            BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
            if (bitmapDrawable.Bitmap != null)
            {
                Bitmap bitmap = bitmapDrawable.Bitmap;
                if (!bitmap.IsRecycled)
                {
                    imageView.SetImageBitmap(null);
                    bitmap.Recycle();
                    bitmap = null;
                }
            }

        }

        Java.Lang.JavaSystem.Gc();
    }

这将释放所有内存,删除对位图的任何引用,并允许垃圾收集器遍历并释放这些位图。

是否在位图上调用recycle()。@rickfalk我还没有。我试过一次,但似乎没有任何效果。什么时候调用recycle()?完成后?在链接到的页面上,单击底部附近的“管理位图内存”链接