慎用setImageResource(int resId)

2016-11-28  本文已影响4682人  许先森的许

1、为什么要慎用 setImageResource(int resId)

源码中注释:

This does Bitmap reading and decoding on the UI

* thread, which can cause a latency hiccup. If that's a concern,

* consider using {@link #setImageDrawable(android.graphics.drawable.Drawable)} or

* {@link #setImageBitmap(android.graphics.Bitmap)} and

* {@link android.graphics.BitmapFactory} instead.

意思说这个方法是在UI thread处理bitmap,会造成主线程的延迟阻塞,建议用setImageDrawable( Drawable drawable )、setImageBitmap( Bitmapbm)两个方法来代替。

2、setImageDrawable( Drawable drawable )和setImageBitmap( Bitmap bm )又有什么区别呢?

看源码:

@android.view.RemotableViewMethod

public void setImageBitmap(Bitmap bm) {

// if this is used frequently, may handle bitmaps explicitly

// to reduce the intermediate drawable object

setImageDrawable(new BitmapDrawable(mContext.getResources(), bm));

}

setImageBitmap( Bitmap bm )其实就是调用setImageDrawable( Drawable drawable )而已,

所以源码里注释建议:如果频繁使用这个方法,可以直接调用setImageBitmap,减少创建不必要的Drawable 对象。因为每次调用这个方法都会new一个Drawable 对象。

3、到底怎么用setImageResource:

setImageDrawable是三个方法中最省内存和高效的,但是写代码时为了偷懒经常用setImageResource更频繁一点,也不是不能用,只要注意一下情况:

a:代码中(非xml)中有大量imageview需要setImage,不建议用setImageResource;

b:一些可切换的页面代码中imageview需要setImage,不建议用setImageResource;

上一篇下一篇

猜你喜欢

热点阅读