基本上每当我尝试使用主页按钮退出我的应用程序然后重新输入时,它会让我在我打开游戏之前强行关闭游戏。当我离开应用程序时,我无法找到如何保存状态,我需要它来保存一个arraylist和一些变量和布尔值,但我不知道该怎么做。这是我的活动和我的surfaceCreated,Destroyed和stuff,surfaceCreated是抛出错误的地方,说线程已经打开。
这是logcat
E / AndroidRuntime(183):未捕获的处理程序:由于未捕获e而线程主要退出 xception E / AndroidRuntime(183):java.lang.IllegalThreadStateException:线程已经过了 tarted。 E / AndroidRuntime(183):at java.lang.Thread.start(Thread.java:1286) E / AndroidRuntime(183):at com.Waldev.cannon.CannonBlast $ panel.surfaceCr eated(CannonBlast.java:515) E / AndroidRuntime(183):在android.view.SurfaceView.updateWindow(Surface View.java:392) E / AndroidRuntime(183):在android.view.SurfaceView.onWindowVisibilityCh anged(SurfaceView.java:182) E / AndroidRuntime(183):在android.view.View.dispatchWindowVisibilityCha nged(View.java:3745) E / AndroidRuntime(183):在android.view.ViewGroup.dispatchWindowVisibili tyChanged(ViewGroup.java:690) E / AndroidRuntime(183):在android.view.ViewGroup.dispatchWindowVisibili tyChanged(ViewGroup.java:690) E / AndroidRuntime(183):在android.view.ViewRoot.performTraversals(ViewR oot.java:694) E / AndroidRuntime(183):在android.view.ViewRoot.handleMessage(ViewRoot。 Java的:1613) E / AndroidRuntime(183):在android.os.Handler.dispatchMessage(Handler.ja VA:99) E / AndroidRuntime(183):在android.os.Looper.loop(Looper.java:123) E / AndroidRuntime(183):在android.app.ActivityThread.main(ActivityThrea d.java:4203) E / AndroidRuntime(183):at java.lang.reflect.Method.invokeNative(Native 方法) E / AndroidRuntime(183):at java.lang.reflect.Method.invoke(Method.java:5 21) E / AndroidRuntime(183):at com.android.internal.os.ZygoteInit $ MethodAndA rgsCaller.run(ZygoteInit.java:791) E / AndroidRuntime(183):at com.android.internal.os.ZygoteInit.main(Zygot eInit.java:549) E / AndroidRuntime(183):at dalvik.system.NativeStart.main(Native Method) @Override
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
}
public void surfaceCreated(SurfaceHolder holder) {
thread.setRunning(true);
thread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// simply copied from sample application LunarLander:
// we have to tell thread to shut down & wait for it to finish, or else
// it might touch the Surface after we return and explode
boolean retry = true;
thread.setRunning(false);
while (retry) {
try {
thread.join();
retry = false;
} catch (InterruptedException e) {
// we will try it again and again...
}
}
}
public void onCreate(Bundle savedInstanceState) {
final Window win = getWindow();
super.onCreate(savedInstanceState);
panelStuffz = new panel(this);
requestWindowFeature(Window.FEATURE_NO_TITLE);
win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(panelStuffz);
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
答案 0 :(得分:0)
正如LogCat告诉你的那样:“线程已经开始了。”
按HOME键不会破坏您的活动,因此当您返回应用程序时,它仍可能在内存中。当您的活动返回到屏幕时,可能会再次调用surfaceCreated()
,导致您尝试再次启动您的线程...尽管它已经在运行,因为surfaceDestroyed()
未关闭顺便说一句。
我没有玩过LunarLander示例代码,也许这种风格适合游戏,但对于一般的Android应用程序,我不推荐这种线程使用方式。