zoukankan      html  css  js  c++  java
  • android 图片内存管理

    图片对象: drawable bitmap etc.
    图片对象在Android上该缓存吗?什么时候缓存?怎么缓存?缓存后使用时怎么取出?怎么销毁?什么时候销毁?
    bitmap对象(new出来的) :需要回收吗? 什么时候回收? 放入view中的bitmap对象需要回收吗?
    imageview 加载网络图片时,怎样设置加载中及加载失败后的图片?
    若事先设置backgroud/src ,当加载网络图片失败后 imageview 为空?

    if (imgView.getDrawable() == null) { //获取的是 src
    Toast.makeText(getActivity(), 图片加载失败, Toast.LENGTH_SHORT).show();
    imgView.setImageDrawable(getResources().getDrawable(R.drawable.icon));
    }

    从网络加载的图片的缓存 销毁 等等.
    OOM 内存溢出 内存heap size限制
    内存怎么计算? 图片大小
    图片三级缓存: 网络、内存、本地 LruCache

    当一个activity奔溃后 自动返回上一个activity 后从新加载资源?

    // 获取到可用内存的最大值,使用内存超出这个值会引起OutOfMemory异常。
    // LruCache通过构造函数传入缓存值,以KB为单位。
    int maxMemory = (int) Runtime.getRuntime().maxMemory() / 1024 ; //获取分配内存
    int cacheSize = maxMemory / 8; //缓存大小
    private LruCache<String, Bitmap> mMemoryCache = new LruCache<String, Bitmap>(cacheSize){
    protected int sizeOf(String key, Bitmap bitmap){
    // 重写此方法来衡量每张图片的大小,默认返回图片数量。
    return bitmap.getByteCount() / 1024;
    }
    };

    background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸
    scaleType只对src起作用;bg可设置透明度
    setImageResource与xml中的src的属性相匹配, 而setBackgroundResource与xml中background对应

    Bitmap真正的位图数据是在ndk中用c写的,所以用setCallback是不能销毁位图数据的,应该调用Bitmap的recycle()来清理内存。


    需要手动释放的bitmap图像通常都是不放入控件中的bitmap,
    也就是说没有其他的对象对该bitmap继续保持引用了,此时调用recycle手动释放bitmap资源。

    若一个drawable,bitmap做为图片资源放入程序的view(例如做为ImageView的resource)中,
    那么此时不需要手动释放资源了,系统会在该view销毁时帮你释放掉该资源的。
    特殊情况是,一个对象不能被释放是因为这个对象被其他的对象所引用,导致系统不敢回收,
    例如声明了一个static Drawable对象,并且绑定了资源图片。此时如果我们想最大利用内存,
    尽量减少过期或者临时不需要的对象在内存中迟迟不能被回收,
    这时我们就考虑用drawable.setCallback(null)来消除这个drawable的引用。
    但是尽量不要这样使用static Drawable,如果忘记回收,极易造成内存泄漏!

    android对于直接通过资源id载入的资源其实是做了cache的了,
    这样下次再需要此资源的时候直接从cache中得到,这也是为效率考虑。但这样做也造成了用过的资源都会在内存中

  • 相关阅读:
    Scala 插入排序
    win10下安装使用mysql-8.0.18
    Autofac注入多数据库(DbContext)
    缓存一致性问题以及方案(一) Redis
    Java编程中,一些好的习惯从一开始就值得坚持
    IDEA项目无法引用本地Class类,引用路径正确但报错标红
    git怎么撤销已经push到远端的commit?
    git的命令大全及如何修改git账号和提交的邮箱和用户名
    renren-fast-vue无法运行相关问题解决办法n ./src/assets/scss/index.scss Module build failed: Error: ENOENT: no su
    VsCode系列(一):下载安装及汉化
  • 原文地址:https://www.cnblogs.com/tozhjj/p/7132582.html
Copyright © 2011-2022 走看看