У меня очень странная проблема с моим приложением!Приложение аварийно завершает работу после закрытия
Я программировал его на бирюшках, и все было в порядке - никаких сбоев или чего бы то ни было. Когда я переместил apk на свой телефон, он также отлично работал , пока я не закрыл приложение - что вызвало сбой, я не знаю, как его получить.
Это заставило меня подозревать, что моя проблема связана с SurfaceView, который я использую, но я не знаю, что может быть проблемой, которая вызывает сбои.
здесь OnCreate:
GameView g;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
g=new GameView(this);
setContentView(g);
}
вот как я создаю SurfaceView:
gameLoopThread = new GameLoopThread(this);
this.requestFocus();
this.setFocusableInTouchMode(true);
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
gameLoopThread.setRunning(false);
while (retry) {
try {
gameLoopThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
gameLoopThread.setRunning(true);
gameLoopThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
}
и вот нить:
import android.annotation.SuppressLint;
import android.graphics.Canvas;
public class GameLoopThread extends Thread {
static final long FPS = 60;
private GameView view;
private boolean running = false;
public GameLoopThread(GameView view) {
this.view = view;
}
public void setRunning(boolean run) {
running = run;
}
@SuppressLint("WrongCall") @Override
public void run() {
long ticksPS = 1000/FPS;
long startTime;
long sleepTime;
while (running) {
Canvas c = null;
startTime = System.currentTimeMillis();
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS-(System.currentTimeMillis() - startTime);
try {
//if (sleepTime > 0)
// sleep(sleepTime);
// else
//sleep(10);
} catch (Exception e) {}
}
}
}
Я не касался ondestroy или onstop, поэтому проблема должна быть где-то в обзоре поверхности, которую я подозреваю.
Edit: весь Gameview:
public GameView(Context c) {
// TODO Auto-generated constructor stub
super(c);
this.c = c;
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
ScoreParticleP=new PointF();
NewScoreParticleP=new PointF();
int srcWidth = options.outWidth;
int srcHeight = options.outHeight;
//it=blocks.iterator();
// Decode with inSampleSize
options.inJustDecodeBounds = false;
options.inDither = false;
options.inScaled = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
this.setKeepScreenOn(true);
WindowManager wm = (WindowManager) c
.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
this.screenw = display.getWidth();
this.screenh = display.getHeight();
this.differencew = (double) screenw/normalw;
this.differenceh = (double) screenh/normalh;
mediaPlayer = MediaPlayer.create(c, R.raw.nyan);
mediaPlayer.setLooping(true);
mediaPlayer.start();
mediaPlayer2 = MediaPlayer.create(c, R.raw.remix);
mediaPlayer2.setLooping(true);
mediaPlayer3 = MediaPlayer.create(c, R.raw.weed);
mediaPlayer3.setLooping(true);
SharedPreferences prefs2 = c.getSharedPreferences("Sp.game.spiceinspace", Context.MODE_PRIVATE);
counter2=prefs2.getInt("score", 0);
this.sprite = BitmapFactory.decodeResource(getResources(),
R.drawable.sprite,options);
this.sprite = Bitmap.createScaledBitmap(sprite, sprite.getWidth() * 3,
sprite.getHeight() * 3, false);
this.heart=BitmapFactory.decodeResource(getResources(),
R.drawable.heart);
this.heart=Bitmap.createScaledBitmap(heart, heart.getWidth() * 3,
heart.getHeight() * 3, false);
currentSpeed = new PointF(0, 0);
currentDirection = new Point(0, 0);
currentPosition = new Point(350, 350);
this.background = BitmapFactory.decodeResource(getResources(),
R.drawable.space);
this.background=Bitmap.createScaledBitmap(background, background.getWidth()*5, background.getHeight()*5, false);
this.lost= BitmapFactory.decodeResource(getResources(),
R.drawable.gameover);
this.lostNew= BitmapFactory.decodeResource(getResources(),
R.drawable.gameovernew);
lostNew=FitAllDevices(lostNew);
lost=FitAllDevices(lost);
this.alien = BitmapFactory.decodeResource(getResources(),
R.drawable.mob_alien);
this.coin = BitmapFactory.decodeResource(getResources(),
R.drawable.item_coin);
partic=BitmapFactory.decodeResource(getResources(),
R.drawable.particle_star);
partic=Bitmap.createScaledBitmap(partic, partic.getWidth()*2, partic.getHeight()*2, false);
this.alien = Bitmap.createScaledBitmap(alien, alien.getWidth() * 3,
alien.getHeight() * 3, false);
asteroid=BitmapFactory.decodeResource(getResources(),
R.drawable.mob_astroid);
asteroid=Bitmap.createScaledBitmap(asteroid, asteroid.getWidth() * 3,
asteroid.getHeight() * 3, false);
goldasteroid=BitmapFactory.decodeResource(getResources(),
R.drawable.mob_goldastroid);
goldasteroid=Bitmap.createScaledBitmap(goldasteroid, goldasteroid.getWidth() * 3,
goldasteroid.getHeight() * 3, false);
mushroom=BitmapFactory.decodeResource(getResources(),
R.drawable.item_mushroom);
mushroom=Bitmap.createScaledBitmap(mushroom, mushroom.getWidth() * 4,
mushroom.getHeight() * 4, false);
coin=Bitmap.createScaledBitmap(coin, coin.getWidth() * 2,
coin.getHeight() * 2, false);
drug=BitmapFactory.decodeResource(getResources(),
R.drawable.item_not);
drug=Bitmap.createScaledBitmap(drug, drug.getWidth() * 4,
drug.getHeight() * 4, false);
rocket=BitmapFactory.decodeResource(getResources(),
R.drawable.item_rocket);
rocket=Bitmap.createScaledBitmap(rocket, rocket.getWidth() * 4,
rocket.getHeight() * 4, false);
alien = FitAllDevices(alien);
mushroom = FitAllDevices(mushroom);
drug = FitAllDevices(drug);
rocket = FitAllDevices(rocket);
asteroid=FitAllDevices(asteroid);
goldasteroid=FitAllDevices(goldasteroid);
sprite = FitAllDevices(sprite);
heart=FitAllDevices(heart);
player = new Spicy(sprite,heart);
hit= soundPool.load(c, R.raw.hit, 1);
pass= soundPool.load(c, R.raw.win, 1);
remix= soundPool.load(c, R.raw.remix, 1);
destroy= soundPool.load(c, R.raw.destroy, 1);
aliensound= soundPool.load(c, R.raw.alien, 1);
gameLoopThread = new GameLoopThread(this);
this.requestFocus();
this.setFocusableInTouchMode(true);
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
boolean retry = true;
gameLoopThread.setRunning(false);
while (retry) {
try {
gameLoopThread.join();
retry = false;
} catch (InterruptedException e) {
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
gameLoopThread.setRunning(true);
gameLoopThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
});
}
редактировать 2 Я нашел LogCat телефона, вот авария: