Android View如何加载drawable资源

本文探讨了Android开发中View如何加载drawable资源,关注是否在加载大图时可能导致ANR或OOM。通过分析源码,发现设置资源ID时并非异步加载,而是直接获取并设置为背景。ResourcesImpl.java中的缓存机制可以避免重复加载,对于图片文件,通过native方法转换为Drawable,以防止ANR。同时,根据屏幕密度调整图片加载,错误配置或过大图片可能导致OOM。
摘要由CSDN通过智能技术生成

Android开发时难免会遇到图片加载的问题,简单的做法就是把问题丢给图片框架处理,几个主流的图片框架各有特色,这里也不展开说,今天突然想了解一下Android图片资源的加载,主要是想参考一下,view是如何加载drawable的,因为我们可以直接在UI线程直接设置view的背景res,如果这个资源图很大会不会导致ANR或者OOM?
首先从View.setBackgroundResource(int resid)开始:

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

        Drawable d = null;
        if (resid != 0) {
            d = mContext.getDrawable(resid);
        }
        setBackground(d);

        mBackgroundResource = resid;
    }

显然,如果是设置当前的资源ID,则不会处理。这里直接通过mContext.getDrawable(resid)获取drawable,然后设置为background,看来这里并不是异步加载图片的,如果是大图时会不会导致ANR呢?
我们接着看:

    public final Drawable getDrawable(@DrawableRes int id) {
        return getResources().getDrawable(id, getTheme());
    }

ResourcesImpl.java

    Drawable loadDrawable(Resources wrapper, TypedValue value, int id, Resources.Theme theme,
            boolean useCache) throws NotFoundEx
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值