我们在代码里调用setBackgroundResource(int resid)来设置一个view控件的背景时,如果图片过大,或者调用setBackgroundResource(int resid)多次时,有可能导致内存溢出.查看代码:

    public void setBackgroundResource(int resid) {
        if (resid != 0 && resid == mBackgroundResource) {
            return;
        }


        Drawable d= null;
        if (resid != 0) {
            d = mResources.getDrawable(resid);
        }
        setBackgroundDrawable(d);


        mBackgroundResource = resid;
    }

可以发现,背景图片最后设置为了一个Drawable对象.Drawable对象占用的内存分为java层的和底层的两部份.JAVA层的内存,如果在你的view释放时,你的背景图片调用了Drawable的setCallback(null), 即取消你的背景图片在VM里的引用,则JAVA这部份的内存空间,在系统调用GC函数时可以把它回收. 但是在native层的内存,GC是释放不了的.这样就会导致有内存泄漏. 解决这个问题的办法有很多种,下面我来说说最简单的一种:

        设置背景时,不要调用setBackgroundResource(int resid),而改用setBackgroundDrawable(Drawable d) 这个函数,这个函数的参数d 用一个BitmapDrawable new出来.上代码:

Bitmap mBgBitmap = null;mBgBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.unlock_bg);setBackgroundDrawable(new BitmapDrawable(mBgBitmap));

这样的好处就是,我们可以保留图片的Bitmap引用mBgBitmap,在我们的VIEW释放时,我们显示的调用

if(mBgBitmap != null  && !mBgBitmap.isRecycled()){    mBgBitmap.recycle();mBgBitmap = null;}

这段代码,就可以把native层的内层也给释放掉,这样就可以彻底解决内存泄漏的问题


更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. android相关知识简介
  3. Android摄像头采集Demo
  4. Linux/Android启动之Machine-Init函数
  5. Android(安卓)Installation error: INSTALL_FAILED_INSUFFICIENT
  6. android中onKeyDown()事件的分析
  7. Android(安卓)TabLayout定制CustomView与ViewPager交互双向联动
  8. Android(安卓)Studio中LogCat Filter的设置
  9. Android(安卓)Studio集成友盟APP统计

随机推荐

  1. Android实现录屏直播(三)MediaProjection +
  2. 【Android(安卓)开发】:UI控件之 ScrollVi
  3. android Activity线性布局和表格布局实例
  4. 如何检查 Android 应用的内存使用情况
  5. Android学习路线:如何成长为高级工程师
  6. APP开发 你应该iOS和Android都开发 还是
  7. Android面试宝典----1.选择填空分析及答
  8. Android(安卓)HIDL 在Java 中使用
  9. Android APP内存优化之图片优化
  10. 如何实现android button事件?