回收从'BitmapDrawable'获取的位图时的问题

时间:2014-09-15 23:21:20

标签: android opengl-es-2.0 bitmapfactory bitmapdrawable

我正在加载一个位图,用作我的OpenGLES 2.0应用程序中的纹理

如果我通过 Bitmapfactory 加载并使用位图,那么一切正常。像这样:

加载

 public void loadBitmaps{

    backgrounds= BitmapFactory.decodeResource(view.getResources(), R.drawable.backgrounds, BMFOptions);
    ...

使用

//Apply as texture to OpenGL Quad

回收

backgrounds.recycle();

现在,问题是...........

当我将位图加载为bitmapDrawable时,我遇到了问题(在下面的代码中解释)。像这样:

在班级声明BitmapDrawable

public class Res{

    BitmapDrawable bd;
    ...

加载

public void loadBitmaps(){

    bd = (BitmapDrawable) view.getResources().getDrawable(R.drawable.backgrounds);
    backgrounds = bd.getBitmap();
    ...

使用

//Apply as texture to OpenGL Quad

回收

backgrounds.recycle();

当这样做时,它第一次工作,但如果我然后按回退出,然后重新启动应用程序,纹理就不会显示,而我得到的只是黑色四边形。

如果我执行以下任何操作,它可以解决问题,我想知道为什么......

  • 从类变量中移动 bd 的声明,所以我正在使用:
  

BitmapDrawable bd =(BitmapDrawable)   。view.getResources()getDrawable(R.drawable.backgrounds);

  • 或者只需在创建位图后执行此操作:
  

bd = null;

  • 最后,我也可以,只是不回收位图,但这不是一个选项

注意我需要以这种方式访问​​位图,而不是使用BitmapFactory,因为我通过XML Alias访问它。

1 个答案:

答案 0 :(得分:3)

缓存和共享

Drawable个实例,因此当您调用getDrawable()时,它将加载当前缓存的实例,而不是创建新的位图。如果您回收基础位图,那将导致将来使用的问题。您可能想要做的是在修改之前复制drawable:

BitmapDrawable bmpDrawable = (BitmapDrawable) view.getResources()
        .getDrawable(R.drawable.backgrounds);
Bitmap original = bmpDrawable.getBitmap();
Bitmap copy = original.copy(original.getConfig(), true);

有关可绘制突变的更多信息,请参阅this blog post