Xamarin.Android OOM 思路整理 (BitmapFactory.DecodeByteArray)

来源:互联网 发布:六级仔细阅读技巧知乎 编辑:程序博客网 时间:2024/05/16 07:09

起因:之前在工程中整合Android-Universal-Image-Loader框架,运行的时候确老是抛OOM异常,怀疑是UIL框架OOM问题,搞了一个星期,还是百思不得其解

思路:测试UIL框架,发现几十M的图和几K的图片没有任何区别,程序照旧会崩掉

         初步排除UIL框架OOM异常问题

         还有什么地方用到了图片方式呢?

         发现程序代码用到了Bitmap的解码 BitmapFactory.DecodeByteArray方法,上网查证后注释代码程序运行OKOOM异常抛出

 

问题找到了

BitmapFactory.DecodeByteArray过度消耗系统内存,导致OOM问题抛出 此方法有毒

解决核心思路:图片,我们只加载适合的、需要的尺寸!!利用BitmapFactory.Options可完成这一项任务

解决方案:

   /// <summary>        /// Byte to Bitmap        /// </summary>        /// <param name="imgByte"></param>        /// <returns></returns>        public static Bitmap byteToBitmap(byte[] imgByte)        {            System.IO.Stream input = null;            Bitmap bitmap = null;            BitmapFactory.Options options = new BitmapFactory.Options();            options.InSampleSize = 8;            input = new MemoryStream(imgByte);            SoftReference softRef = new SoftReference(BitmapFactory.DecodeStream(                    input, null, options));            bitmap = (Bitmap)softRef.Get();            if (imgByte != null)            {                imgByte = null;            }            try            {                if (input != null)                {                    input.Close();                }            }            catch (IOException e)            {                e.PrintStackTrace();            }            return bitmap;        }

关于Bitmap,个人觉得这里有两篇文章还不错,可以借鉴一下:

http://www.jianshu.com/p/f75ef4e24c01

http://www.jianshu.com/p/a7d9562405ef


0 0
原创粉丝点击