Android 是否缓存了dimen值?

Android 是否缓存了dimen值?,android,Android,执行以下操作是否有任何性能提升: final int pixels = getResources.getDimensionPixelSize(R.dimen.pixels); for (CustomView view: views) { view.setPixelValue(pixels); } public int getDimensionPixelSize(int id) throws NotFoundException { synchronized (mAccessLoc

执行以下操作是否有任何性能提升:

final int pixels = getResources.getDimensionPixelSize(R.dimen.pixels);
for (CustomView view: views) {
    view.setPixelValue(pixels);
}
public int getDimensionPixelSize(int id) throws NotFoundException {
    synchronized (mAccessLock) {
        TypedValue value = mTmpValue;
        if (value == null) {
            mTmpValue = value = new TypedValue();
        }
        getValue(id, value, true);
        if (value.type == TypedValue.TYPE_DIMENSION) {
            return TypedValue.complexToDimensionPixelSize(
                    value.data, mMetrics);
        }
        throw new NotFoundException(
                "Resource ID #0x" + Integer.toHexString(id) + " type #0x"
                + Integer.toHexString(value.type) + " is not valid");
    }
}
vs

或者是缓存了dimens值/字节码优化了/其他一些优化使得这变得多余了吗?

更深入地研究,直到哪一个是本地的,这是不可能的。但是,从
Resources.getDimensionPixelsize()
source可以说:

final int pixels = getResources.getDimensionPixelSize(R.dimen.pixels);
for (CustomView view: views) {
    view.setPixelValue(pixels);
}
public int getDimensionPixelSize(int id) throws NotFoundException {
    synchronized (mAccessLock) {
        TypedValue value = mTmpValue;
        if (value == null) {
            mTmpValue = value = new TypedValue();
        }
        getValue(id, value, true);
        if (value.type == TypedValue.TYPE_DIMENSION) {
            return TypedValue.complexToDimensionPixelSize(
                    value.data, mMetrics);
        }
        throw new NotFoundException(
                "Resource ID #0x" + Integer.toHexString(id) + " type #0x"
                + Integer.toHexString(value.type) + " is not valid");
    }
}
  • 它将通过
    synchronized(mAccessLock)
    锁定资源(请阅读,如果您的其他线程将在同一时刻尝试访问资源,则其中一个线程将等待)
  • 它将调用
    TypedValue.complexToDimensionPixelSize()中的一些浮点数学
    
  • 它可能会创建
    TypedValue
    对象
  • 它将至少进行5次方法调用
所以,也许它缓存在本地的某个地方,但即使如此,这个电话对你们来说绝对不是免费的。 下面是我为这个问题所做的一些测量(只有单线程访问资源):

int像素=0;
Resources res=getResources();
长毫秒=System.currentTimeMillis();
对于(int i=0;i<100000;i++){
像素=res.getdimension像素大小(R.dimen.my_dimen);
}
Log.e(标记“Time”+(System.currentTimeMillis()-ms));
在使用Android棒棒糖的S6上,它的通话时间约为816毫秒,即8160纳秒/次

最后,在您的情况下(我相信您最多有10-20次迭代),就性能而言,这并不重要。在更多的迭代中和/或在访问中的资源时的一些并发性可能是重要的

就我个人而言,我建议在室外进行,以获得更好的风格和较小但速度仍有所提高