【问题标题】:The application may be doing too much work on its main thread (Android) [duplicate]该应用程序可能在其主线程(Android)上做了太多工作[重复]
【发布时间】:2013-07-01 18:45:54
【问题描述】:

我正在开发一个日历应用程序,并使用 textview 作为日历单元格,当我在启动应用程序后检查 logcat 时,我发现来自 Choreographer 的这条消息“跳过 76 帧!该应用程序可能在其主要工作上做了太多工作线”。 我知道我正在创建很多 textviews (120),但是如何在不影响我的应用程序性能的情况下构建我的日历? 是否有另一种方法来构建支持事件的日历?

【问题讨论】:

  • 这与另一个支持事件的日历无关。您只需将您的 TextView 创建移动到后台线程。在 Android 开发者页面上阅读AsyncTasks。但是,是的,不同的视图可能会减轻负担/
  • 推荐的方法是为每个日历单元格使用 TextView 吗?您可能想查看示例应用程序以确保。我确信 GridView 或 TableLayout 或其他一些复合 ViewGroup 比使用一堆 TextView 更好,这正是 LogCat 抱怨的原因
  • @Jade GridView 或 TableLayout 都需要创建 TextViews...我看不出这有什么帮助。
  • @LuckyMe 你是对的“can”
  • 在 UI 线程之外创建 TextViews 将什么都没有,因为您只能从 UI 线程将它们添加到布局中,并且它是测量绘图这会占用所有时间,而不是创建对象。

标签: android


【解决方案1】:

120 个文本视图似乎很多,尤其是似乎需要几个屏幕的数据。

当您有多个数据屏幕时,考虑使用适配器视图是合乎逻辑的,例如ListViewGridView。适配器视图使用视图回收将在任何给定时间使用的视图数量限制为大约一个屏幕的价值。

【讨论】:

  • 这个。考虑回收你的观点。 Google 创建的日历就是这样做的。他们的代码是开源的。值得学习。
【解决方案2】:

您不使用Pickers 是否有原因。

如果您需要滚动自己的控件,则需要将任何繁重的工作转移到另一个线程。你可以

1) 使用 java Runnable 接口或 Thread 类,可能带有匿名内部类(参见here)。

2) 使用 FutureTask + 执行器服务(here 是一个例子)。

【讨论】:

  • 我没有使用选择器,因为我需要在我的日历上显示事件,我还需要点击事件来显示一些信息(这就是我使用 textview 的原因)
【解决方案3】:

由于您正在制作日历,因此事先知道单元格的数量,因此考虑可能会夸大包含单元格的布局,然后使用一个命令设置整个布局,然后您只需填写文本的TextViews?

【讨论】:

  • 这是一个有趣的想法,但我使用的是从 Textview 继承的自定义类,我需要添加一些属性来存储信息,我如何在 XML 文件中使用它?
  • O.o 现在我没有经验,但这是我找到的一个 Android 链接 [developer.android.com/training/custom-views/create-view.html]。不确定它是否会有所帮助,但我希望如此。当我在 Google 中搜索“android custom view xml”时,我也得到了一些结果。在这一点上我只能说祝你好运:P
  • 感谢您的帮助,谢谢!
  • 没问题,随时:)
【解决方案4】:

我搜索并找到了这个链接:http://developer.android.com/reference/android/view/Choreographer.html。这是 API 16 中引入的一个新类。

Choreographer 允许应用将自身连接到 vsync,并适当地计时以提高性能。

Android 视图动画在内部使用 Choreographer 的目的相同:正确计时动画并可能提高性能。

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

据我了解,Choreographer 只能检测到跳帧。它无法说明为什么会发生这种情况。

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

You may refer this question

【讨论】:

    【解决方案5】:

    除非我确定我的应用表现不佳,否则我不会做出任何更改。我经常在我的模拟器上看到此消息,有时是在 Android 仍在启动时,有时是在运行 Google 提供的简单 osample 应用程序时。这值得一读:

    Choreographer(697): Skipped 152 frames! Debug log

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-18
      • 1970-01-01
      相关资源
      最近更新 更多