Java 是不是;“解码资源”;方法内部维护位图引用?

Java 是不是;“解码资源”;方法内部维护位图引用?,java,android,resources,out-of-memory,Java,Android,Resources,Out Of Memory,我是android新手,所以这个问题可能很明显,但我会问,因为我没有找到它 我正在处理大量随机生成的对象(游戏中的敌人),我担心是否应该继续依赖解码资源: public class Bird extends Actor { int x=0, y=0; public Bird (Context context) { setFace(BitmapFactory.decodeResource(context.getResources(),R.drawable.bird1)); ... 或

我是android新手,所以这个问题可能很明显,但我会问,因为我没有找到它

我正在处理大量随机生成的对象(游戏中的敌人),我担心是否应该继续依赖解码资源:

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

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

...
或者创建一个我自己的“位图管理器”,根据需要分配位图,并在已解码的情况下重用它们

i、 e:

这将需要一个静态类和许多其他东西,但也许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;
    }
}
公共类艺术家{
私有静态上下文mContext;
私有静态哈希表资产=新哈希表();
公共静态void setContext(Context c){
mContext=c;
}
公共静态位图getFace(int-id){
if(assets.containsKey(id))返回assets.get(id);
位图d=BitmapFactory.decodeResource(mContext.getResources(),id);
资产出售(id,d);
返回d;
}
}
虽然,我担心这个静态类会引用未使用的位图(因为游戏在某些敌人身上移动时不再出现),但是这些未使用的位图不会被垃圾收集

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

欢迎对我的前一个问题有任何想法,我将再留下两个问题:

-位图的“参与者引用”消失且哈希表中的引用也消失后,是否会成功地对其进行垃圾收集?


-您是否发现我的方法中存在一些明显的缺陷?

您是如何使用这些位图的?你在使用OpenGL吗?如果是这样的话,还有一个更好的解决方案。我只是把它画到画布上:publicvoidondraw(canvasg){If(frameNumber
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;
    }
}