任何开始开发android应用程序的人都会在logcat上看到这个消息。编舞(ABC):跳过xx帧!应用程序可能在其主线程上做了太多的工作。“那么,它到底意味着什么,你为什么要关心它,以及如何解决它。

这意味着您的代码需要很长时间才能处理,而框架正因此而被跳过,这可能是因为您正在应用程序或DB访问的核心做一些繁重的处理,或者其他导致线程停止一段时间的事情。下面是一个更详细的解释:Choreographer允许应用程序将自己连接到vsync,并对事情进行适当的时间安排以提高性能。

Android视图动画内部使用编舞器的目的是相同的:正确地计时动画,并可能提高性能。

由于Choreographer被告知每个vsync事件,我可以判断由Choreographer.post*API传递的Runnable是否没有在一个帧的时间内完成,从而导致帧被跳过。

据我理解,编舞员只能检测帧跳过。它无法解释为什么会发生这种情况。

消息“应用程序可能在其主线程上做了太多的工作。”可能会误导你。

你为什么要担心

当这条消息弹出在Android仿真器上,并且跳过的帧数量相当少(<100)时,您可以安全地打赌仿真器是慢的-这种情况几乎时有发生。但是,如果帧的数量跳过而且很大,并且按300+的顺序排列,那么您的代码可能会出现一些严重的问题。Android设备的硬件种类繁多,与iOS和Windows设备不同。RAM和CPU各不相同,如果您希望在所有设备上都有一个合理的性能和用户体验,那么您需要修复这个问题。当框架被跳过时,UI是缓慢和滞后的,这不是一种理想的用户体验。

如何修复

要解决这一问题,需要识别存在或可能发生长时间处理的节点。最好的方法是在一个与主UI线程分离的线程中完成所有的处理,不管这个线程有多小或多大。因此,无论是访问SQLite数据库中的数据,还是做一些硬核运算,还是简单地对数组排序-在另一个线程中进行排序

现在这里有一个陷阱,您将为执行这些操作创建一个新线程,当您运行应用程序时,它会崩溃,说“只有创建视图层次结构的原始线程才能触摸其视图”。您需要知道,Android中的UI只能由主线程或UI线程更改。任何其他试图这样做的线程都会失败并与此错误崩溃。您需要做的是在runOnUiThread中创建一个新的Runnable,在这个Runnable中,您应该执行涉及UI的所有操作。找一个例子这里.

因此,我们有线程和可运行的处理数据的主线程,还有什么?Android中有AsyncTask,它允许在UI线程上执行长时间的进程。这是最有用的,当你的应用程序是数据驱动或WebAPI驱动或使用复杂的UI,如那些构建使用画布。AsyncTask的功能是允许在后台进行操作,一旦您完成了处理,您就可以简单地在UI上执行所需的操作,而不会造成任何滞后效应。这是可能的,因为AsyncTask本身来自Activity的UI线程-您通过AsyncTask在UI上执行的所有操作都是一个与主UI线程不同的线程,不妨碍用户交互。

因此,这是您需要知道的,以使顺利的Android应用程序,据我所知,每个初学者从他的控制台得到这条消息。

android 线程太多,应用程序可能在其主线程上做了太多的工作。相关推荐

  1. 该应用程序可能在其主线程上做过多的工作

    本文翻译自:The application may be doing too much work on its main thread I am new to Android SDK/API envi ...

  2. 子线程循环10次,接着主线程循环5次,接着又回到子线程循环10次,接着再回到主线程又循环5次,如此循环50次,请写出程序。

    public class ThreadTest { /** * * 子线程循环10次,接着主线程循环5次,接着又回到子线程循环10次,接着再回到主线程又循环5次,如此循环50次,请写出程序. * * ...

  3. Java多线程之----主线程会等待子线程结束再结束么,怎么让主线程等待子线程结束呐?

    首先给出结论: 主线程和子线程之间没有谁先谁后结束这种关联,它们只是各自负责自己的线程任务,如果该线程的任务结束了,该线程自然会结束运行. talk is cheap,show me the code ...

  4. 多线程学习--案例-子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次

    子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序. package Demo4; public class ThreadTe ...

  5. Java多线程面试题:子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50次

    近在学习多线程,特贴在这里,并附上自己所作答案(参考与张孝祥老师的方法). 题目如下: 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次, 接着再回到主线程又循环100,如此循环50 ...

  6. Android窗口机制:六、一定要在主线程才可以更新UI吗?为什么?(源码版本SDK31)

    Android 窗口机制 SDK31源码分析 总目录 初识 DecorView与SubDecor的创建加载 Window与Window Manager的创建加载 ViewRootImpl的创建以及视图 ...

  7. java 线程 函数_java – 从后台线程调用主线程上的函数

    更新 我已经更新了这个问题,使用建议的SwingWorker类包含Java实现的源代码,以实现与Objective-C示例相同的结果.希望这将有助于未来的冒险家. Document myDoc = . ...

  8. Android:Socket客户端开发,Android 的Socket客户端优化,Android非UI线程修改控件程序崩溃的问题

    一.Android:Socket客户端开发 创建一个工程 我们要做的是按下按键之后,去往服务器 (服务器) 或者我们自己写的服务器 ,给他发送一些预定好的东西 然后打开操作界面 然后修改一下 你要发送 ...

  9. android 线程那点事

    在操作系统中,线程是操作系统调度的最小单元,同时线程又是一种受限的系统资源,即线程不可能无限制的产生,并且线程的创建和销毁都会有相应的开销,当系统中存在大量的线程时,系统会通过时间片轮转的方式调度每个 ...

最新文章

  1. 李彦宏,韩寒等入围本年度《时代百人》候选名单
  2. All About Monads
  3. 阿里2019实习内推,五轮技术面+一轮HR面,Java岗面经
  4. python 基础笔记十一 - random模块
  5. 第九讲 二阶齐次常系数线性ODE
  6. 饿了么口碑活跃用户增长近美团3倍,2020年行业竞争局势将扭转?
  7. C语言实现图形ADT(Graph ADT)接口COMP2521(附完整源码)
  8. 基于SpringJDBC 实现关键功能-QueryRuleSqlBulider
  9. [精讲-3]Offline Domain Join
  10. python代码设计测试用例_[CP_01] Python循环结构案例:模拟银行存取款业务,设计执行测试用例...
  11. 三维振镜原理_展商专访 | 先临三维与易加三维联合携多款精品及新品亮相2020年TCT亚洲展...
  12. vue微信支付回到原界面不执行mounted里的内容
  13. [安全攻防进阶篇] 八.那些年的熊猫烧香及PE病毒行为机理分析
  14. php后台登录验证(含验证码)
  15. kpw3刷安卓教程2019_买kindle paperwhite4的别急,或许3更好用,因为3可以刷安卓!...
  16. 服务器的mdf文件怎么打开,mdf文件如何打开 mdf文件打开操作步骤
  17. AutoCAD实用功能之查看xdata扩展属性
  18. MATLAB Radon检测图像,初学radon变换 检测直线 matlab程序实现
  19. wlan网页登录认证原理
  20. github本地项目上传到远程仓库

热门文章

  1. 前端学习(1342):mongoose验证规则拿到错误信息
  2. 前端学习(1327):node全局对象global
  3. TLV5618 双路12位DAC 模拟SPI驱动
  4. IEEE1459功率理论计算方法
  5. STM32 DSP库的使用方法
  6. Request请求:Failed to execute ‘setRequestHeader‘ on ‘XMLHttpRequest‘: String contains non ISO-8859-1 c
  7. JS之返回字符首次出现位置的indexOf
  8. CS144 lab4 计算机网络实验 笔记
  9. TCP服务器epoll的多种实现
  10. java dom no protocol_DOM