识别由于Android OS导致的应用程序缓慢

时间:2016-06-20 14:09:43

标签: android performance android-fragments android-lifecycle

如何检查应用程序运行缓慢的原因?更准确地说,哪种生命周期方法在Android中执行需要更多时间。

我已经尝试记录每个活动和片段的生命周期方法,但我无法弄清楚延迟的原因。  onCreate被调用,但是在调用onResume之前会有很长的延迟(大约1秒)。

由于上述延迟,用户感觉应用程序响应不是很快。

高端手机的延迟时间缩短至约100毫秒。但是它的旧版2012-2011模型有这么大的延迟。

关于如何进一步调查以确定延迟的根本原因的一些想法,以及我们如何优化应用以更快地浏览屏幕。

提前致谢。

1 个答案:

答案 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

所以我们有ThreadRunnable用于处理主线程数据,还有什么? android中有AsyncTask,可以在UI线程上进行长时间的处理。当您的应用程序是数据驱动或Web api驱动或使用像使用Canvas构建的复杂UI时,这是最有用的。 AsyncTask的强大功能是允许在后台执行操作,一旦完成处理,您只需在UI上执行所需的操作,而不会产生任何滞后效果。这是可能的,因为AsyncTaskActivity的UI线程派生自己 - 你通过AsyncTask在UI上完成的所有操作都是与主UI线程不同的线程,没有障碍用户互动。

所以这是制作流畅的Android应用程序所需要知道的,据我所知,每个初学者都会在他的控制台上收到此消息。