首页 > 解决方案 > 是什么导致 android.support.v4.app.Fragment.setUserVisibleHint() 崩溃?

问题描述

从最近开始,我在我的应用程序的 crashlytics 中看到了几次以下崩溃:

Fragment.java 第 960 行 android.support.v4.app.Fragment.setUserVisibleHint

Fatal Exception: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: android.support.v7.widget.RecyclerView$SavedState
       at android.os.Parcel.readParcelableCreator + 2855(Parcel.java:2855)
       at android.os.Parcel.readParcelable + 2781(Parcel.java:2781)
       at android.os.Parcel.readValue + 2684(Parcel.java:2684)
       at android.os.Parcel.readSparseArrayInternal + 3134(Parcel.java:3134)
       at android.os.Parcel.readSparseArray + 2367(Parcel.java:2367)
       at android.os.Parcel.readValue + 2741(Parcel.java:2741)
       at android.os.Parcel.readArrayMapInternal + 3053(Parcel.java:3053)
       at android.os.BaseBundle.initializeFromParcelLocked + 288(BaseBundle.java:288)
       at android.os.BaseBundle.unparcel + 232(BaseBundle.java:232)
       at android.os.BaseBundle.putBoolean + 569(BaseBundle.java:569)
       at android.support.v4.app.Fragment.setUserVisibleHint + 960(Fragment.java:960)
       at android.support.v4.app.FragmentStatePagerAdapter.instantiateItem + 121(FragmentStatePagerAdapter.java:121)
       at android.support.v4.view.ViewPager.addNewItem + 1004(ViewPager.java:1004)
       at android.support.v4.view.ViewPager.populate + 1186(ViewPager.java:1186)
       at android.support.v4.view.ViewPager.populate + 1086(ViewPager.java:1086)
       at android.support.v4.view.ViewPager$3.run + 267(ViewPager.java:267)
       at android.view.Choreographer$CallbackRecord.run + 986(Choreographer.java:986)
       at android.view.Choreographer.doCallbacks + 764(Choreographer.java:764)
       at android.view.Choreographer.doFrame + 696(Choreographer.java:696)
       at android.view.Choreographer$FrameDisplayEventReceiver.run + 965(Choreographer.java:965)
       at android.os.Handler.handleCallback + 873(Handler.java:873)
       at android.os.Handler.dispatchMessage + 99(Handler.java:99)
       at android.os.Looper.loop + 214(Looper.java:214)
       at android.app.ActivityThread.main + 7073(ActivityThread.java:7073)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run + 494(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main + 965(ZygoteInit.java:965)

我无法重现崩溃。

有谁知道可能是什么原因造成的?

标签: androidandroid-fragmentsandroid-appcompatandroidx

解决方案


显然,崩溃是由支持兼容库之一中的错误引起的,'com.android.support:appcompat-v7:28.0.0'或者'com.android.support:support-compat:28.0.0'

迁移到AndroidX反而解决了这个问题。

在 Android Studio 3.2 及更高版本中,您可以通过从菜单栏中选择 Refactor > Migrate to AndroidX 将现有项目迁移到 AndroidX。

有关信息:

AndroidX 将原始支持库 API 替换为 androidx 命名空间中的包。只有包和 Maven 工件名称发生了变化;类、方法和字段名称没有改变。

AndroidX 是一个重新设计的库,使包名称更加清晰。因此,从现在开始,android 层次结构将仅适用于 android 操作系统附带的 android 默认类,其他库/依赖项将成为 androidx 的一部分(更有意义)。所以从现在开始,所有的新开发都将在 androidx 中更新。

Google 不再支持原始支持库:

版本 28.0.0 是支持库的最后一个版本。


推荐阅读