如何检查应用程序运行缓慢的原因?更准确地说,哪种生命周期方法在Android中执行需要更多时间。
我已经尝试记录每个活动和片段的生命周期方法,但我无法弄清楚延迟的原因。
onCreate
被调用,但是在调用onResume
之前会有很长的延迟(大约1秒)。
由于上述延迟,用户感觉应用程序响应不是很快。
高端手机的延迟时间缩短至约100毫秒。但是它的旧版2012-2011模型有这么大的延迟。
关于如何进一步调查以确定延迟的根本原因的一些想法,以及我们如何优化应用以更快地浏览屏幕。
提前致谢。
答案 0 :(得分:1)
如果您正在主线程中处理大量数据(包括复杂的UI呈现),那么您可以在logcat中找到这种消息:
W/Trace(1274): Unexpected value from nativeGetEnabledTags: 0
I/Choreographer(1274): Skipped 55 frames! The application may be doing too much work on its main thread.
这可能会导致应用程序在渲染方面变慢 UI
建议修复
解决这个问题需要识别可能发生或可能发生长时间处理的节点。最好的方法是进行所有处理,无论与主UI线程分开的线程有多小或多大。所以它可以从SQLite Database
访问数据或者做一些核心数学或简单地对数组进行排序 - 在不同的线程中进行操作
现在有一个问题,你将创建一个新的线程来执行这些操作,当你运行你的应用程序时,它会崩溃说“只有创建视图层次结构的原始线程才能触及它的视图”。你需要知道这个事实,android中的UI只能由主线程或UI线程更改。尝试这样做的任何其他线程都会因此错误而失败并崩溃。你需要做的是在Runnable
内创建一个新的runOnUiThread
,在这个runnable中你应该做所有涉及UI的操作。找一个example here。
所以我们有Thread
和Runnable
用于处理主线程数据,还有什么? android中有AsyncTask
,可以在UI线程上进行长时间的处理。当您的应用程序是数据驱动或Web api驱动或使用像使用Canvas构建的复杂UI时,这是最有用的。 AsyncTask
的强大功能是允许在后台执行操作,一旦完成处理,您只需在UI上执行所需的操作,而不会产生任何滞后效果。这是可能的,因为AsyncTask
从Activity
的UI线程派生自己 - 你通过AsyncTask
在UI上完成的所有操作都是与主UI线程不同的线程,没有障碍用户互动。
所以这是制作流畅的Android应用程序所需要知道的,据我所知,每个初学者都会在他的控制台上收到此消息。