问答中心分类: ANDROID应用程序可能在其主线程上做了太多工作
0
匿名用户 提问 3月 前

我不熟悉Android SDK/API环境。这是我第一次尝试画一个图表。我尝试在模拟器上使用3个不同的免费库运行不同类型的示例代码,但布局屏幕上没有显示任何内容。logcat正在重复以下消息:

带跟踪(1378):nativeGetEnabledTags的意外值:0

当我运行一个与授权库的评估副本相关的示例代码时,这个问题并没有持续下去,图表也起到了作用。

user1162766 回复 3月 前

你是在另一条线上画图表吗?

user1162766 回复 3月 前

谢谢你的评论,我对问题进行了编辑,使之更清楚。运行时的活动显示我正在运行一个没有设计的活动,其布局=>显示白色屏幕。

user1162766 回复 3月 前

@阿雷克斯:不,我没有使用单独的线程。

user1162766 回复 3月 前

我认为,不建议您在主线程上执行长时间操作,因为这会冻结整个应用程序,您可以在这里阅读如何使用线程:堆栈溢出。com/questions/3391272/…忽略“执行HTTP请求的代码”,只在那里执行可能很长的操作。

user1162766 回复 3月 前

这似乎是一个重复的问题。请参考在这里! 非常感谢。

user1162766 回复 3月 前

为什么你不尝试搜索,你会找到有关编舞的信息。我建议你阅读以下答案:堆栈溢出。com/questions/11266535/…

user1162766 回复 3月 前

我擦了擦模拟器的数据,一切都恢复了丝般的光滑。就我而言,没有什么沉重的负担,所有的资源都很好,等等。

user1162766 回复 3月 前

取决于应用程序的功能需求。这种警告在某些情况下是不可避免的。例如,我的应用程序使用地理编码器获取用户输入地址的lat/lng。当用户键入“Florida”之类模糊的内容时,我通常会收到这样的警告,说跳过了35帧。有时候这没什么大不了的。

user1162766 回复 3月 前

我在给textview分配int值而不是字符串时出现了这个错误。

user1162766 回复 3月 前

我在调试时也收到了这个警告。。确保未处于调试模式。

18 Answers
0
Jorgesys 回答 3月 前

摘自:Android用户界面:修复跳过的帧

任何一个开始开发android应用程序的人都会在网上看到这条信息“Choreographer(abc):跳过了xx帧!应用程序可能是那么它到底是什么呢

这意味着你的代码需要很长时间来处理和帧

以下是更详细的解释:

Choreographer允许应用程序将自己连接到vsync
Android view动画在内部使用Choreographer实现同样的功能
因为编舞被告知每一个vsync事件,我可以判断
据我所知,编舞只能检测到跳帧。
消息“应用程序可能在其主应用程序上做了太多工作”
资料来源:Logcat中编舞信息的含义

你为什么要担心
当这个消息在android上弹出时
如何修复它
解决这一问题需要识别存在或不存在的节点
现在这里有一个陷阱,你将创建一个新的线程在这里.
所以我们有线程和可运行线程来处理主线程之外的数据,
这就是制作平滑安卓所需要知道的

Noobification 回复 3月 前

我只是有一个应用程序,如果我点击一个按钮,按钮的背景图像就会改变,并且按钮不可点击。我是如何做了太多工作的:(

BenJaminSila 回复 3月 前

@Remian8985-按钮的背景图像更改(假设您正在下载此图像)应在异步任务中完成,即执行下载背景操作并在UI线程上发布结果(返回图像)。请参阅Android参考资料链接

user25 回复 3月 前

@BenJaminSila在任务中改变背景?真正地

forresthopkinsa 回复 3月 前

@用户25“假设您正在下载此图像”

Robin Dijkhof 回复 3月 前

“当android emulator上弹出此消息且跳过的帧数相当小(<100)时,您可以放心地打赌emulator运行缓慢”这一点今天仍然适用吗?模拟器发展得很快,对吧?

Allen Vork 回复 3月 前

我有一个问题是关于“我可以判断编舞是否传递了一个Runnable。post*API没有在一帧时间内完成,导致跳过帧”。正如我们所知,编舞将处理所有决斗时间在现在之前的选手。这意味着当一个runnable需要很长时间才能执行时,它将在以后的帧中执行所有帧。所以不会删除任何帧,只会在稍后显示。

null_awe 回复 3月 前

AsyncTask现在已被弃用!

Emon Hossain Munna 回复 3月 前

它确实对我起到了作用,我的滞后是为了NotifyDataChange(),我在另一个线程中的RunOnUiThread中进行了调用。有必要在UI线程上运行,以便在UI的回收器视图中立即更新数据。

M.Ed 回复 3月 前

@null_awe您应该使用RxJava或更好的协同程序在后台线程中执行长时间运行的操作。

0
Sithu 回答 3月 前

正如上面其他人回答的,“跳过了55帧!”意味着你的申请中有一些繁重的处理过程。
就我而言,我的申请没有繁重的流程。我反复检查了所有的东西,删除了那些我认为有点重的过程。
我移除了片段、活动和库,直到只剩下骨架。但问题仍然没有消失。我决定查看资源,发现我使用的一些图标和背景非常大,因为我忘记检查这些资源的大小。
因此,我的建议是,如果以上答案都没有帮助,你也可以检查你的资源文件大小。

akrabi 回复 3月 前

也为我工作。我有一个应用程序,做了很少的工作,但很慢,滞后。我不断收到跳过的帧日志。一旦我把背景从我的活动中移除,一切都很好。谢谢

M Barbosa 回复 3月 前

回答得很好,我相信这正是我的问题。我尝试了一系列其他(相当复杂的)解决方案,但应用程序同样缓慢。我拿出了所有的web服务,并试图彻底优化我的代码。没用,然后我看到了这个。一旦我删除了我的背景图片(我拥有的最大图片),这个应用程序就会以你可以点击的速度运行,即使是旧的“慢”代码。

Nicolas Mastromarino 回复 3月 前

你让我开心!

Metin Ilhan 回复 3月 前

:)你是一个旷课的天才。

Sithu 回复 3月 前

@batsheva不必为1KB。这取决于你的需要,比如说你需要更清晰的图像,你可以使用更高的分辨率,但要确保你分成不同大小的资源文件夹。

HandyPawan 回复 3月 前

我没有图像,所有图标都很小,但仍然需要时间。你能给我另一个解决方案吗。如果你有

Rohit Lalwani 回复 3月 前

这个答案让我的夜晚。。。在尝试了将近5个小时后救了我一整晚。。。

Hila Grossbard 回复 3月 前

对我来说太棒了!我也意识到我没有分离全部的我的观察者(尤其是我片段中的观察者)

0
Prakhar1001 回答 3月 前

我也有同样的问题。
在我的例子中,我使用的背景图像是可绘制的。这张图片的大小约为130kB,在我的android应用程序的启动屏幕和主页中使用。
解决方案-我只是将那个特定的图像从drawables转移到drawables xxx文件夹,可以释放背景中占用的大量内存,跳过的帧不再跳过。
使现代化使用“nodp”可绘制资源文件夹存储后台可绘制资源
密度限定的可绘制文件夹或可绘制节点优先吗?

bgplaya 回复 3月 前

我将我的大背景图像从drawable移动到mimap xxxhdpi,它成功了!

N.Droid 回复 3月 前

你帮了大忙。谢谢

Timo Bähr 回复 3月 前

这个解决方案正在发挥作用。我在用文件夹drawable-xxxhdpi相反drawable这大大减少了使用的内存(减少约70%)。同样值得一提的是,同样大小的屏幕在DPI大小上也有所不同。它们之间的像素比率为ldpi = 1:0.75,mdpi = 1:1,hdpi = 1:1.5,xhdpi = 1:2,xxhdpi = 1:3,xxxhdpi = 1:4.通过使用drawable-xxxhdpi文件夹可以将图像缩小到设备的屏幕大小,从而减少内存和CPU消耗。

Shruti 回复 3月 前

移动图像来自drawabledrawable-nodpi阻止应用程序Out of Memory Error.

novas1r1 回复 3月 前

哦,我的上帝。。。谢谢我在drawable文件夹中有一张图片,这让我的应用程序非常慢(尽管图片只有100kb!!!)。生成可绘制的xxx文件后(我使用了Android drawable Importer),我的应用程序速度非常快。谢谢!

0
user1643723 回答 3月 前

UI线程延迟的另一个常见原因是SharedReferences访问。当你打电话给PreferenceManager.getSharedPreferences和其他类似的方法首次联合使用。xml文件立即被加载和解析同理.
解决此问题的一个好方法是从后台线程触发第一个SharedReference加载,尽早启动(例如从onCreate你的应用程序类)。这样,在您想要使用首选项对象时,它可能已经被构造好了。
不幸的是,有时在启动的早期阶段(例如,在初始活动中,甚至在应用程序本身中),读取首选项文件是必要的。在这种情况下,仍然可以通过使用MessageQueue.IdleHandler。在主线程上执行所有需要执行的操作,然后在活动完全绘制完成后安装IdleHandler以执行代码。在该Runnable中,您应该能够访问SharedReference,而不会延迟太多绘图操作,也不会让Choreographer不高兴。

Emre Gürses 回复 3月 前

对于这种情况,您应该更喜欢apply()方法,而不是commit()。apply()方法无法阻止用户界面。你可以从这里看开发商安卓com/培训/数据存储/共享首选项

0
phen0menon 回答 3月 前

我也有同样的问题。Android Emulator在Android<6.0上运行良好。当我使用emulator Nexus 5(安卓6.0)时,该应用程序的运行速度非常慢I/Choreographer: Skipped frames在日志中。
所以,我通过改变清单文件解决了这个问题hardwareAccelerated选择true这样地:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapplication">

    <application android:hardwareAccelerated="true">
        ...
    </application>
</manifest>

2022年1月更新根据@M.Ed的评论:硬件加速启用默认情况下,如果目标API>=14。

M.Ed 回复 3月 前

对于将来阅读本文的人来说,这是不必要的。如果目标是14级以上的API,则默认情况下会启用硬件加速。根据文件。“如果目标API级别>=14,则默认情况下会启用硬件加速,但也可以显式启用。”资料来源:开发商安卓com/指南/主题/图形/硬件加速