“decodeResource”方法是否在内部维护位图引用?

时间:2012-11-08 05:01:15

标签: java android resources out-of-memory

我是Android的新手所以也许这个问题很明显,但我会问它,因为我找不到它。

我正在处理很多随机生成的对象(游戏中的敌人),我担心是否应该继续依赖decodeResource:

public class Bird extends Actor {
int x=0, y=0;

public Bird (Context context) {
    setFace(BitmapFactory.decodeResource(context.getResources(),R.drawable.bird1));

...

或创建我自己的'位图管理器以根据需要分配位图,并在已经解码后重复使用它们。

即:

public class Bird extends Actor {
int x=0, y=0;

public Bird (Context context) {
    setFace(Director.getFace(Director.BIRD));

...

这需要一个静态类和许多其他的东西,但也许decodeResource已经在内部为我做了这个?

换句话说,是否真的有必要实现这个位图跟踪器'手动'

目前,我正在使用它:

public class Artist {
    private static Context mContext;
    private static Hashtable<Integer, Bitmap> assets = new Hashtable<Integer, Bitmap>();

    public static void setContext(Context c) {
        mContext = c;
    }

    public static Bitmap getFace(int id){
        if (assets.containsKey(id)) return assets.get(id);

        Bitmap d = BitmapFactory.decodeResource(mContext.getResources(), id);
        assets.put(id, d);
        return d;
    }
}

尽管如此,我担心这个静态类引用了未使用的位图(因为游戏移动了一些敌人不再来了),那么这些未使用的位图将不会被垃圾收集。

我想我必须通过限制资产哈希表的大小来解决这个问题,从中删除访问量最少的位图。

欢迎任何关于我以前的问题的想法,我还会再提出两个问题:

- 在'参与者的引用消失并且散列表中的引用也消失后,位图是否成功进行垃圾回收?

- 你发现我的方法存在一些明显的缺陷吗?

0 个答案:

没有答案