我构建了这个应用程序,可以拍照,显示它们以供接受,并通过邮件将它们上传到网络服务器。
概念和执行非常简单。但随后Android应用程序中的应用程序正在冻结(我有一个Xperia Z3 +,我有相当多的资源,也在Moto X中尝试过)。
为了尝试重现这一点,我拍了一张照片(它会自动尝试上传)...按下屏幕的电源按钮关闭...然后当我点亮屏幕时,应用程序需要一段时间再次开始工作(我可以看到,因为我有一个背景动画)。经过一些重试...应用程序将冻结,我将不得不关闭它重试。
有关如何解决此问题的任何建议?
我的想法是,我可以通过从屏幕上删除动画元素来稍微解决问题......至少感知性能会更好,因为应用程序在任何应用程序切换上都不会显示为冻结...因此我希望能够使用活动生命周期事件中的onPause,onStop来清除动画。我猜这些对象是序列化的,所以我将保存序列化和反序列化时间,并且感知性能将提高,因为在onResume,onRestart事件中不会看到冻结的应用程序。
这是可能的吗?
非常感谢你 卡盘
答案 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();
}
}