OGeek|极客世界-中国程序员成长平台

标题: android - 应用程序可能在其主线程上做了太多工作 [打印本页]

作者: 菜鸟教程小白    时间: 2022-8-1 01:20
标题: android - 应用程序可能在其主线程上做了太多工作

我是 Android SDK/API 环境的新手。这是我第一次尝试绘制绘图/图表。我尝试使用 3 个不同的免费库在模拟器上运行不同类型的示例代码,布局屏幕上没有显示任何内容。 logcat 重复以下消息:
W/Trace(1378):来自 nativeGetEnabledTags 的意外值:0
I/Choreographer(1378):跳过了 55 帧!应用程序可能在其主线程上做了太多工作。

当我运行与许可库的评估副本有关的示例代码时,问题并没有持续存在并且图表有效。



Best Answer-推荐答案


取自: Android UI : Fixing skipped frames

Anyone who begins developing android application sees this message on logcat “Choreographer(abc): Skipped xx frames! The application may be doing too much work on its main thread.” So what does it actually means, why should you be concerned and how to solve it.



这意味着您的代码需要很长时间来处理和框架
因为它而被跳过,可能是因为一些沉重的
您在应用程序或数据库的核心进行的处理
访问或任何其他导致线程停止一段时间的事情。


Here is a more detailed explanation:

Choreographer lets apps to connect themselves to the vsync, and properly time things to improve performance.

Android view animations internally uses Choreographer for the same purpose: to properly time the animations and possibly improve performance.

Since Choreographer is told about every vsync events, I can tell if one of the Runnables passed along by the Choreographer.post* apis doesnt finish in one frame’s time, causing frames to be skipped.

In my understanding Choreographer can only detect the frame skipping. It has no way of telling why this happens.

The message “The application may be doing too much work on its main thread.” could be misleading.

source : Meaning of Choreographer messages in Logcat



为什么你应该关注

当此消息在android上弹出时
模拟器和跳过的帧数相当小(<100)然后
您可以安全地押注模拟器运行缓慢——这种情况会发生
几乎所有时间。但是如果跳过的帧数很大
并且在 300+ 的数量级中,可能会有一些严重的问题
你的代码。与 ios 不同,Android 设备具有大量硬件
和 Windows 设备。 RAM 和 CPU 各不相同,如果你想要一个
所有设备上的合理性能和用户体验,然后您
需要解决这个问题。跳过帧时,UI 很慢并且
滞后,这不是理想的用户体验。

如何修复它

解决此问题需要识别存在或
可能会发生长时间的处理。最好的方法是做
所有的处理,不管线程中的大小是分开的
从主 UI 线程。所以无论是从 SQLite 数据库访问数据还是
做一些核心数学或简单地对数组进行排序——在一个
不同的线程

现在这里有一个问题,你将创建一个新的线程来做
这些操作,当你运行你的应用程序时,它会崩溃
说“只有创建 View 层次结构的原始线程才能
触摸它的观点”。你需要知道这个事实,android 中的 UI 可以
仅由主线程或 UI 线程更改。任何其他线程
尝试这样做,失败并崩溃并出现此错误。你什么
需要做的是在runOnUiThread和里面创建一个新的Runnable
这个runnable你应该做所有涉及UI的操作。寻找
一个例子here .

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

所以这是你制作流畅的android需要知道的
应用程序,据我所知,每个初学者都会在他的
安慰。

关于android - 应用程序可能在其主线程上做了太多工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14678593/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://jike.in/) Powered by Discuz! X3.4