【问题标题】:Identify application slowness due to Android OS识别由于 Android 操作系统导致的应用程序运行缓慢
【发布时间】:2016-06-20 14:09:43
【问题描述】:

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

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

由于上述延迟,用户感觉应用程序的响应速度不是很好。

高端手机的延迟减少到大约 100 毫秒。但是 2012-2011 年的旧型号有这么大的延迟。

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

提前致谢。

【问题讨论】:

  • onCreateView()、onActivityCreated() 和 onStart() 在这些生命周期方法之间也被调用。你也尝试过计时吗?您是否也尝试过使用调试器并单步执行以查看是否存在需要很长时间的特定方法调用?
  • onCreateonResume 是否做了很多可以异步完成的代码?膨胀的布局是否非常嵌套和复杂?您是否发现内存图有任何您无法(或无法)解释的爆炸性增长?您的片段是否在膨胀的同时执行了很多任务?您是否正在连接到数据库(在线、SQLite、Realm 或类似数据库)?
  • 是的,我使用 baseActivity 和 baseFragment 完成了所有生命周期方法。在大多数情况下,onViewCreated 是最慢的。我已经尝试通过避免嵌套布局来降低布局的复杂性。没有数据库连接,只有带有动画的布局膨胀。
  • 仔细查看内存图是个好主意。让我检查一下

标签: android performance android-fragments android-lifecycle


【解决方案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 线程分开的线程中进行所有处理,无论线程大小。因此,无论是访问数据表单 SQLite Database,还是进行一些核心数学运算,或者只是对数组进行排序——在不同的线程中进行

现在这里有一个问题,您将创建一个新线程来执行这些操作,当您运行您的应用程序时,它会崩溃,说“只有创建视图层次结构的原始线程才能触摸它的视图”。你需要知道这个事实,android 中的 UI 可以由主线程或 UI 线程更改。尝试这样做的任何其他线程都会失败并因此错误而崩溃。您需要做的是在runOnUiThread 内部创建一个新的Runnable,并且在这个runnable 内部您应该执行所有涉及UI 的操作。查找example here

所以我们有ThreadRunnable 用于处理主线程外的数据,还有什么? android中有AsyncTask,它可以在UI线程上进行长时间的处理。当您的应用程序是数据驱动或 Web api 驱动或使用复杂的 UI(例如使用 Canvas 构建的那些)时,这是最有用的。 AsyncTask 的强大之处在于它允许在后台执行操作,一旦完成处理,您可以简单地在 UI 上执行所需的操作,而不会造成任何滞后效果。这是可能的,因为AsyncTask 派生自Activity 的UI 线程——您通过AsyncTask 在UI 上执行的所有操作都是与主UI 线程不同的线程,不会妨碍用户交互。

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

【讨论】:

  • 使用 Asynctask 确实有帮助,但对我的问题没有帮助。它可能纯粹与 UI 和操作系统有关。
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 2011-07-06
  • 2010-12-11
  • 1970-01-01
  • 2015-04-16
相关资源
最近更新 更多