Skip to content

drawable与bitmap内存占用大小

Mr.wu edited this page Apr 3, 2017 · 4 revisions

1, 比较Drawable与Bitmap占用内存大小 2, 比较BitmapFactory类的decodeResource方法与decodeStream方法的效率

好吧,先来看第1个测试! 以下这个是测试加载1000个Drawable对象的代码,很简单的,我就不解释了!

 
public class Main extends Activity
{
    int number = 1000;
    Drawable[] array;
 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
 
        array = new BitmapDrawable[number];
                     
        for(int i = 0; i < number; i++)
        {
            Log.e("", "测试第" + (i+1) + "张图片");
            array[i] = getResources().getDrawable(R.drawable.img);
        }
    }
}

下面再来看一下加载1000个Bitmap对象的代码,同样的,代码很简单的,我就不解释了!

public class Main extends Activity
{
    int number = 1000;
    Bitmap bitmap[];
 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
 
       bitmap = new Bitmap[number];
 
       for (int i = 0; i < number; i++)
       {
           Log.e("", "测试第" + (i+1) + "张图片");
           bitmap[i] = BitmapFactory.decodeResource(getResources(), R.drawable.img);
       }
    }
}

看看上面的输出,才加载到第8张图片,程序就报错了“java.lang.OutOfMemoryError: bitmap size exceeds VM budget”。

通过上面的例子,可以看清楚地看出来,使用Drawable保存图片对象,占用更小的内存空间。 而使用Biamtp对象,则会占用很大内存空间,很容易就出现OOM了!

下面我们再来看一个例子,这个也是加载Bitmap对象。 只不过,之次不是使用BitmapFactory的decodeResource方法, 而是使用decodeStream方法,看代码。

public class Main extends Activity
{
    int number = 1000;
    Bitmap bitmap[];
 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
 
       bitmap = new Bitmap[number];
 
       for (int i = 0; i < number; i++)
       {
           Log.e("", "测试第" + (i+1) + "张图片");
           bitmap[i] =BitmapFactory.decodeStream(getResources().openRawResource(R.drawable.img));//这里换了方法
       }
    }
}
 

从上面可以看出,程序在加载到第566张的时候,就出现了OOM错误。 不过,跟第2个例子比起来,你会发现,程序可以加载更多的图片。 这说明了使用BitmapFactory的decodeResource方法会占据大量内存, 而使用使用decodeStream方法,则占据更小的内存。

从时间上来说,看看日志输出,大概估算了一下加载一张图片所需要的时间,发现, decodeResource加载图片需要约0.17秒的时间, 而使用decodeStream方法,只需要约0.08秒的时间! 这说明了,decodeStream无论是时间上还是空间上,都比decodeResource方法更优秀!!

从上面三个例子,可以看出,用第一种方法(即用Drawable加载图片)可以加载更加的图片,加载32张图片的时间约为0.01秒! 我试着把Drawable的数量调至1000000,程序在运行时,停在了153761张图片里,手机提示,“应用程序无响应…” 个人猜测,Drawable应该不属于常驻内存的对象,不然的话,不可能不会出现OOM的~~

网上关于Drawable与Bitmap的资料太少,不能深入学习,真是遗憾~

刚才又做了个测试,把第一个例子中的 array[i] = getResources().getDrawable(R.drawable.img); 方法换成了 array[i] = Drawable.createFromStream(getResources().openRawResource(R.drawable.img), null); 结果和第三个例子一样,在第566张图片中,出现了OOM错误! 而且,加载的时间都是一样~~ 这样一来,我就更加迷惑了~~

Home

Android 开发录

-深入理解LayoutInflater.inflate()的参数

计算机网络原理

数据库

Java 垃圾回收机制

Java 开发录

面试

搭建翻墙shadowsocks 教程

其他

Clone this wiki locally