无法用力关闭重新输入android应用程序

时间:2010-07-13 20:22:19

标签: java android

基本上每当我尝试使用主页按钮退出我的应用程序然后重新输入时,它会让我在我打开游戏之前强行关闭游戏。当我离开应用程序时,我无法找到如何保存状态,我需要它来保存一个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);
}

1 个答案:

答案 0 :(得分:0)

正如LogCat告诉你的那样:“线程已经开始了。”

按HOME键不会破坏您的活动,因此当您返回应用程序时,它仍可能在内存中。当您的活动返回到屏幕时,可能会再次调用surfaceCreated(),导致您尝试再次启动您的线程...尽管它已经在运行,因为surfaceDestroyed()未关闭顺便说一句。

我没有玩过LunarLander示例代码,也许这种风格适合游戏,但对于一般的Android应用程序,我不推荐这种线程使用方式。