我是Android SDK / API环境的新手 . 这是我第一次尝试绘制情节/图表 . 我尝试使用3个不同的免费库在模拟器上运行不同类型的示例代码,在布局屏幕中没有显示任何内容 . logcat重复以下消息:
W/Trace(1378): Unexpected value from nativeGetEnabledTags: 0
I/Choreographer(1378): Skipped 55 frames! The application may be doing too much work on its main thread.
当我运行与许可库的评估副本有关的示例代码时,问题并未持续存在且图表有效 .
15 回答
我不是专家,但是当我想将数据从我的Android应用程序发送到Web服务器时,我得到了这个调试消息 . 虽然我使用AsyncTask类并在后台进行数据传输,但是为了从服务器获取结果数据,我使用了AsyncTask类的get()方法,这使得UI同步,这意味着你的UI将等待太长时间 . 所以我的建议是让你的应用程序在一个单独的线程上完成每个面向网络的任务 .
正如其他人在上面回答的那样,“跳过了55帧!”意味着您的申请中会有一些繁重的处理 .
就我而言,我的申请中没有繁重的过程 . 我对所有内容进行了双重和三重检查,并删除了我认为有点沉重的过程 .
我删除了碎片,活动,库,直到只剩下骨架 . 但问题仍然没有消失 . 我决定检查资源,发现我使用的一些图标和背景非常大,因为我忘了查看这些资源的大小 .
所以,我的建议是,如果上述答案都没有帮助,您也可以检查资源文件的大小 .
我有同样的问题 . Android Emulator在Android <6.0上运行良好 . 当我使用模拟器Nexus 5(Android 6.0)时,应用程序在日志中使用
I/Choreographer: Skipped frames
非常慢 .所以,我通过将Manifest文件
hardwareAccelerated
选项更改为true
来解决此问题,如下所示:在这个问题上做了大量的研发后,我得到了解决方案,
在我的情况下,我使用的服务将每2秒运行一次,使用runonUIThread,我想知道问题是在那里,但根本没有 . 我发现的下一个问题是我在may App中使用大图像,这就是问题所在 .
我删除了图像并设置了新图像 .
结论: - 查看您的代码是否有任何原始文件,您使用的是大尺寸 .
您可以使用Glide库来加载图像..它将在后台线程上加载图像..
我有同样的问题 . 当我在另一台计算机上运行代码时,它工作正常 . 然而,在我看来,它显示“应用程序可能在其主线程上做了太多工作” .
我通过重新启动Android studio [File - > Invalidated caches / Restart - >点击“Invalidate and Restart”]解决了我的问题 .
UI线程延迟的另一个常见原因是SharedPreferences访问 . 当您第一次调用
PreferenceManager.getSharedPreferences
和其他类似方法时,会立即加载相关的.xml文件并在同一个线程中进行解析 .解决此问题的一个好方法是从后台线程触发第一个SharedPreference加载,尽可能早地启动(例如,从Application类的
onCreate
开始) . 这样,首选对象可能已经在您想要使用它时构建 .不幸的是,有时在启动的早期阶段(例如在初始Activity或甚至应用程序本身)中读取首选项文件是必要的 . 在这种情况下,仍然可以通过使用
MessageQueue.IdleHandler
来避免停止UI . 执行您需要在主线程上执行的所有其他操作,然后安装IdleHandler以在完全绘制Activity后执行代码 . 在该Runnable中,您应该能够访问SharedPreferences而不会延迟太多的绘图操作并使Choreographer不满意 .我有同样的问题 . 在我的情况下,我有2个嵌套的相对布局 . RelativeLayout总是要做两次测量 . 如果嵌套RelativeLayouts,则会得到指数测量算法 .
取自: Android UI : Fixing skipped frames
尝试使用以下策略以提高应用性能:
如果可能,请使用多线程编程 . 即使您的智能手机有一个核心(线程可以在不同的核心运行,如果处理器有两个或更多),性能优势也是巨大的 . 使您的应用程序逻辑与UI分离是很有用的 . 使用Java线程,AsyncTask或IntentService . Check this .
阅读并遵循Android开发网站的misc性能提示 . Check here .
优化您的图像...不要使用大于100KB的图像...图像加载需要太多CPU并导致您的应用程序挂起 .
首先阅读警告 . 它表示主线程上的负载更多 . 所以你要做的就是在一个线程中运行更多功能的函数 .
我的应用有同样的问题 . 但它除了显示卡片和文本列表之外没有其他功能 . 什么都没有在后台运行 . 但经过一些调查发现卡片背景的图像设置导致了这一点,即使它很小(350kb) . 然后我使用http://romannurik.github.io/AndroidAssetStudio/index.html将图像转换为9patch图像 .
这对我有用 .
我也有同样的问题 .
我的情况是我使用的背景图像是drawables . 这个特定的图像大约130kB,并在我的Android应用程序中的启动画面和主页使用 .
Solution - 我刚刚从drawables将该特定图像移动到drawables-xxx文件夹,并且能够释放大量占用背景的内存并且不再跳过跳帧 .
Update 使用'nodp' drawable资源文件夹存储背景drawables文件 .
Will a density qualified drawable folder or drawable-nodpi take precedence?
我在开发一个在网格布局上使用大量可绘制png文件的应用程序时遇到了同样的问题 . 我也试图尽可能优化我的代码..但它对我来说没有用..然后我试着减小那些png的大小..并猜测它的工作绝对正常..所以我的建议是减少可绘制资源的大小,如果有的话..