多次重启后应用程序冻结

时间:2016-02-19 17:06:34

标签: codenameone

我构建了这个应用程序,可以拍照,显示它们以供接受,并通过邮件将它们上传到网络服务器。

概念和执行非常简单。但随后Android应用程序中的应用程序正在冻结(我有一个Xperia Z3 +,我有相当多的资源,也在Moto X中尝试过)。

为了尝试重现这一点,我拍了一张照片(它会自动尝试上传)...按下屏幕的电源按钮关闭...然后当我点亮屏幕时,应用程序需要一段时间再次开始工作(我可以看到,因为我有一个背景动画)。经过一些重试...应用程序将冻结,我将不得不关闭它重试。

有关如何解决此问题的任何建议?

我的想法是,我可以通过从屏幕上删除动画元素来稍微解决问题......至少感知性能会更好,因为应用程序在任何应用程序切换上都不会显示为冻结...因此我希望能够使用活动生命周期事件中的onPause,onStop来清除动画。我猜这些对象是序列化的,所以我将保存序列化和反序列化时间,并且感知性能将提高,因为在onResume,onRestart事件中不会看到冻结的应用程序。

这是可能的吗?

非常感谢你 卡盘

1 个答案:

答案 0 :(得分:2)

这不是由动画引起的,可能是由未被捕获的异常或应用程序性能不佳引起的。

要查看您的应用效果,请将需要反馈的任何长流程移至您的表单的(AsyncTask)方法而不是postShow()方法,而不是beforeShow()。如果它不需要实时(IntentService)的UI反馈,请考虑使用Display.getInstance().scheduleBackgroundTask()在低优先级线程上运行您的任务,同时序列化它,这可以在beforeShow()方法。如果您的表单是手动编码的(非GUI),请在addShowListener()中执行繁重的过程。

同时减少您在应用中使用的图片数量,因为这可能会在加载大量图片时阻碍您的应用效果。

避免不必要地使用revalidate(),通常不会在循环中调用它,它有点贵,请改用repaint()

您还可以使用Android ddms检查您的应用是否遇到了一些错误。

锁定屏幕或最小化不应该影响您的应用程序,除非应用程序启动时显示启动画面(如果您在显示启动时最小化应用程序,这通常会冻结应用程序)。我相信这是一个众所周知的问题。

另一种选择可能是"暂停 - 恢复"行为。当应用程序暂停时(电源按钮,来电等),将调用stop()方法,然后在返回时调用start()方法。

如果在stop()方法期间有进度指示器,则还原调用将重新显示进度指示器,其前一个表单为"在表单"之前。这样,当进度指示器被取消时,它会显示"之前的表格"。您可以使用" suspend / resume"在模拟器中测试此行为。菜单。

要解决此问题,只需在stop()方法中处理进度指示器:

public void stop() {
    current = Display.getInstance().getCurrent();
    if(current instanceof Dialog) {
        ((Dialog)current).dispose();
        current = Display.getInstance().getCurrent();
    }
}