Я написал игру, и я пытаюсь сделать ее лучше и избавиться от ошибок, и у меня есть как меню, так и состояние игры, опираясь на поток, но для меню I заблокирован чертеж, чтобы он рисовал каждый экран только один раз. Мой телефон перегревается в меню, поэтому я хотел создать поток только в игровом состоянии и сделать меню независимым от потока, например, перерисовывая прикосновение.Создание не-потокового меню - приложение SurfaceView для Android
Я знаю, как сделать все это, и это довольно просто, но я получаю странные ошибки, исключения с нулевым указателем для моих растровых изображений, которые работают безупречно, когда поток включен.
У меня есть функция OnDraw (Canvas с), где я все написано, что рисовать на каждом состоянии (например, меню или состояние игры)
В потоке она выглядит следующим образом (только рисунок часть)
c = null;
c = holder.lockCanvas();
synchronized(holder){
onDraw(c);
}
holder.unlockCanvasAndPost(c);
Теперь я написал простой метод для вызова для того, чтобы привлечь в меню
private void reDraw(){
menuCanvas = null;
menuCanvas = holder.lockCanvas();
synchronized(holder){
onDraw(menuCanvas);}
holder.unlockCanvasAndPost(menuCanvas);
}
И в onSizeChanged методе @Override protected void onSizeChanged (int w, int h, int oldw, int oldh) { screenW = w; screenH = h;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
while (bmpBackground==null){
if (screenW>500){
bmploader = BitmapFactory.decodeResource(getResources(),R.drawable.bg_planet,options);
bmpBackground = Bitmap.createScaledBitmap(bmploader, screenW, screenW, true);
if (bmploader!=null){
bmploader.recycle();
bmploader = null;
}
}
else{
bmploader = BitmapFactory.decodeResource(getResources(),R.drawable.bg_planet_small,options);
bmpBackground = Bitmap.createScaledBitmap(bmploader, screenW, screenW, true);
if (bmploader!=null){
bmploader.recycle();
bmploader = null;
}
}
}
loadMusic();
loadBitmaps();
loadShip();
changeState(states.TITLE);
reDraw();
super.onSizeChanged(w, h, oldw, oldh);
}
Это в значительной степени говорит мне, что bmpBackground является нулевым и бросает ошибку. И до того, как я просто изменил состояние заголовка, и он рисовал нормально (используя рисование нитей);