【问题标题】:Android how to properly finish an activityAndroid如何正确完成一项活动
【发布时间】:2011-11-26 16:27:44
【问题描述】:

我正在使用在许多示例中看​​到的 SurfaceView/Thread 模型制作一个 android 游戏。我正在尝试将组件拆分为多个活动。现在我有一个菜单活动和一个游戏活动。出于某种原因,当我尝试完成游戏活动以返回菜单活动时,我的应用程序将变得无响应。它似乎在模拟器上运行良好,但在我的设备(Samsung Mesmerize)上它会变得无响应。我有一种感觉,这是因为一个线程在游戏活动中仍然很忙,但我不知道如何杀死该线程。我也尝试过打破游戏循环,但似乎没有帮助。

我的SurfaceView有一个内线程类,这里是run()的实现

public void run()
    {
        _isRunning = true;
        Canvas c = null;
        while(_isRunning)
        {
            try
            {
                c = _surfaceHolder.lockCanvas();
                synchronized(_surfaceHolder)
                {
                    if(_engine != null)
                    {
                        _engine.gameLogic();
                        if(c != null)
                            _engine.draw(c);
                    }
                }
            }
            finally
            {
                if(c != null)
                    _surfaceHolder.unlockCanvasAndPost(c);
            }
        }
    }

【问题讨论】:

  • 如果您确定它是由线程引起的,请考虑使用threadpool 管理/控制所有线程生命周期,将它们全部杀死,只需调用 ExecutorService.shutdownNow();
  • 我不太确定。我想这可能是一个没有完成的线程。有时活动成功退出到基础活动,有时应用程序变得完全没有响应。它似乎在模拟器上正常工作。
  • 然后使用代码 sn-p 改进您的问题,异常堆栈跟踪可能会帮助其他人找到您的问题。
  • 从未抛出异常。应用只是变得无响应。

标签: android multithreading android-activity


【解决方案1】:

经过一两个小时的调试,我找到了解决问题的方法。在调用 lockCanvas() 之前,我必须跟踪表面是否还活着。我在两个活动中都使用了相同的循环,并在游戏活动的表面被破坏后调用 lockCanvas() 导致问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多