Android空指针onDraw位图图像

时间:2013-03-04 21:38:47

标签: android nullpointerexception bitmapfactory

我遇到了一个我似乎无法解决的问题!我正在开发一个简单的安卓游戏并且几乎实现了所有内容,但后来决定添加一些障碍(游戏是月球登陆风格的游戏)。

基本上,我已经创建了一个Asteroid类,我只是想在屏幕上绘制它们。在加载游戏时,小行星被绘制,一切正常,但如果按下主页按钮或关闭电源然后重新启动游戏,我会得到一个NPE:

03-04 21:33:21.243: E/AndroidRuntime(10748): FATAL EXCEPTION: Thread-680
03-04 21:33:21.243: E/AndroidRuntime(10748): java.lang.NullPointerException
03-04 21:33:21.243: E/AndroidRuntime(10748):    at com.swiss196.LunarLander.GameThread.doDraw(GameThread.java:421)
03-04 21:33:21.243: E/AndroidRuntime(10748):    at com.swiss196.LunarLander.GameThread.run(GameThread.java:386)

它指向以下代码:

canvas.drawBitmap(test2.getBitmap(), 120, 120, null);

这表明getBitmap返回的canvas或test2对象/图像是null,但在此之前我检查画布是否为null。在位图中,我检查图像也不为空:

public Bitmap getBitmap() {
if(asteroidImage == null)
    asteroidImage = BitmapFactory.decodeResource(mGameView.getContext().getResources(),
                                                 R.drawable.asteroid);

return asteroidImage;
}

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我忘了从包中重新加载一些所需的变量,包括图像..

感谢您的帮助!

答案 1 :(得分:0)

您可能超出了内存预算,这就是您在尝试decode your Bitmap时获得空值的原因。

开发者网站有pretty good descriptions如何避免这种情况。

使用的一个重要选项(再次查看第二个链接以获取示例如何使用它)是“BitmapFactory.Options”,它允许您只验证您的Bitmap是否有足够的内存:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;

引用文档

  

解码时将inJustDecodeBounds属性设置为true可避免   内存分配,为位图对象返回null但设置   outWidth,outHeight和outMimeType。这种技术可以让你阅读   施工前图像数据的尺寸和类型(和   内存分配)位图。