【问题标题】:java.lang.IllegalStateException: Unable to create layer for vjava.lang.IllegalStateException:无法为 v 创建层
【发布时间】:2017-05-02 22:28:28
【问题描述】:

我在 crashlytics 上有这个例外,不知道如何重现或可能是什么原因。有人对我应该从哪里开始寻找有任何指示吗?仅影响 Android 5+。

Fatal Exception: java.lang.IllegalStateException: Unable to create layer for v
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:323)
       at android.os.Looper.loop(Looper.java:135)
       at android.app.ActivityThread.main(ActivityThread.java:5585)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)

谢谢。

编辑:我想更新一下,它不仅会影响 Android 5,而且似乎会影响 Android 5+

【问题讨论】:

  • 您是在开发原生应用还是其他平台,如 Xamarin?
  • 普通 Android 与 Java。
  • 我假设您对发生这种情况的位置有所了解。将相关活动的代码和布局复制粘贴到您的问题中
  • 我真的不知道它发生在哪里,因为 Crashlytics 的崩溃报告没有给我更多信息,而且我从来没有发生过,也没有用户报告过。话虽这么说,这个答案stackoverflow.com/a/43853650/704836 可能有点像我在我的代码中使用makeSceneTransitionAnimation 一次非常简单的ImageView。由于我不知道有任何用户遇到此问题,因此测试起来有点困难。
  • 这主要发生在 FireOS 设备上。不知道为什么。

标签: android android-5.0-lollipop


【解决方案1】:

这个问题似乎与Scene transition with hero elements throws Layer exceeds max. dimensions supported by the GPU 有关。

您应该查看您正在进行的任何活动交易,尤其是makeSceneTransitionAnimation() 的影响。

【讨论】:

  • 我确实有一个电话给makeSceneTransitionAnimation,其中我传递了一个简单的ImageView。感谢您的链接。
  • @casolorz 它阻止了崩溃吗?你能分享你的经验吗?
  • 随着时间的推移,这个特定的崩溃已经消失(这个问题来自 2017 年),但我不记得是因为 makeSceneTransitionAnimation 还是它随着时间的推移自行消失了。
【解决方案2】:
Fatal Exception: java.lang.IllegalStateException: Unable to create layer for LinearLayout, size 1080x4160 exceeds max size 4096
       at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
       at android.os.MessageQueue.next(MessageQueue.java:323)
       at android.os.Looper.loop(Looper.java:136)
       at android.app.ActivityThread.main(ActivityThread.java:6186)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

我对 NestedScrollView 中的 RecyclerView 有同样的问题

RecyclerView

解决方案: 由于滚动视图或嵌套滚动视图中的 RecyclerView 尝试一次加载所有项目。当 RecyclerView 一次加载所有项目时,也会加载现在在屏幕上不可见的项目。如果您将日志放在 RecylerView 的 onBindViewHolder 中,您会发现所有项目都在开始时加载,而不是基于项目的可见性。

这会导致 UI 一次加载超过 1-1.5 个屏幕的内容。这会导致父 LinearLayout(在 ScrollView 内)抛出异常。建议对您的内容进行分页,一次加载不超过 1-1.5 个屏幕的内容。 I had also issue related to same with Recyclerview without animation.

【讨论】:

    【解决方案3】:

    manifest 中添加android:hardwareAccelerated="false"application 标记解决我的问题

    编辑: 请参阅@inteist 的评论

    【讨论】:

    • 这不是一个好的解决方案。它使一切都变得超级锯齿和缓慢。没有理由惩罚每个人,因为 Samsun 和 LG 搞砸了他们的一些模型。
    【解决方案4】:

    当我尝试创建一个简单的视图时,我也遇到了这个问题。我只需要在其 xml 中设置android:forceHasOverlappingRendering="false"。请注意,它仅适用于 API 级别 24。

    【讨论】:

    • 但是我把它放在哪里呢?我什至不知道它在进行什么活动。
    • 是的,很难找到,因为日志不包含有关该视图元素的任何信息。我建议您逐屏浏览您的应用程序,并尝试找出哪个活动/片段包含该视图,因为该应用程序在尝试渲染它时会崩溃。如果您使用 git 对项目进行源代码控制,另一种方法是使用 git bisect。首先,您必须在它工作时找到以前的提交,然后您可以使用 bisect 找到包含错误部分的提交。在这里您可以找到有关如何使用 bisect 的更多信息:git-scm.com/docs/git-bisect
    【解决方案5】:

    就我而言,这是一个愚蠢的错误,Android Studio 没有显示任何警告。

    我有一个 ID 为 @+id/myView 的视图集,但我还在同一视图/标签中设置了 android:layout_below=@id/myView

    类似这样的:

    <TextView
        android:id="@+id/textview"
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:layout_below="@id/textview" /> <!-- The traitor :( -->
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      • 1970-01-01
      • 2018-10-19
      • 2012-06-06
      相关资源
      最近更新 更多