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

任何开始开发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应用程序,据我所知,每个初学者从他的控制台得到这条消息。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值