Ich habe eine Oberflächenansicht und eine GameThread-Klasse. Das gameThread aktualisiert und malt die SurfaceView-Klasse.End SurfaceView und GameThread bei Beenden der App
Jetzt, wenn ich die App verlasse (durch Drücken der Home-oder Zurück-Taste) bekomme ich eine Nachricht, dass die App Kraft geschlossen. Das ist, weil der GameThread immer noch versucht, auf der gelöschten Oberflächenansicht zu zeichnen ...
Also wie kann ich die App ordnungsgemäß beenden, ohne diese Force-Close-Benachrichtigung zu erhalten? Ich möchte, dass die GameThread-Klasse stoppt, wenn die Zurück-Taste gedrückt wird. Es sollte pausieren, wenn man auf Home drückt und im Hintergrund läuft. Beim Wiedereinstieg in das noch laufende Spiel sollte es wieder aufnehmen ....
Irgendwelche Ideen?
Das ist mein GameThread Klasse ist:
public class GameThread extends Thread{
private GameView view;
public boolean isRunning = false;
public GameThread(GameView view) {
this.view = view;
}
public void setRunning(boolean setRunning) {
isRunning = setRunning;
}
public void run() {
while(isRunning) {
Canvas c = null;
view.update();
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.draw(c);
}
}finally {
if(c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
}
}
Es hält meine GameView Klasse Aktualisierung:
public class GameView erstreckt Surface {
private GameThread gameThread;
public GameView(Context context, Activity activity) {
super(context);
gameThread = new GameThread(this);
init();
holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
gameThread.setRunning(true);
gameThread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
});
}
public void init() {
}
public void update() {
}
public void draw(Canvas canvas) {
super.draw(canvas);
}
}
Wenn zu Hause meine logcat diese Taste erscheint:
02-24 18:24:59.336: E/SurfaceHolder(839): Exception locking surface
02-24 18:24:59.336: E/SurfaceHolder(839): java.lang.IllegalStateException: Surface has already been released.
02-24 18:24:59.336: E/SurfaceHolder(839): at android.view.Surface.checkNotReleasedLocked(Surface.java:437)
02-24 18:24:59.336: E/SurfaceHolder(839): at android.view.Surface.lockCanvas(Surface.java:245)
02-24 18:24:59.336: E/SurfaceHolder(839): at android.view.SurfaceView$4.internalLockCanvas(SurfaceView.java:872)
Haupttätigkeit:
public class MainActivity extends Activity {
private RelativeLayout relativeLayout;
private GameView gameView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gameView = new GameView(this, this);
setContentView(R.layout.activity_main);
relativeLayout = (RelativeLayout)findViewById(R.id.mainView);
relativeLayout.addView(gameView);
}
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
super.onBackPressed();
gameView.onBackPressed();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Bitte den Hauptaktivitätscode hinzufügen! – BlueSword
@Jay hat den Hauptaktivitätscode hinzugefügt – user2410644