android - ViewTreeObserver 中的 IndexOutOfBoundsException

标签 android admob indexoutofboundsexception

几个月以来,我在 Crashlytics 和 Google Play 控制台中遇到了 IndexOutOfBoundsException。我无法弄清楚它到底发生在哪里,因为堆栈跟踪仅列出了框架代码(请参阅下面的堆栈跟踪)。

根据 firebase 事件,我猜它会在显示广告时发生(它总是在关卡结束时发生,这就是我显示广告的地方)。

我使用 AdMob 作为中介网络,包括 AdMob、Unity 和 Facebook 广告。 我有很多这样的崩溃,它发生在运行各种 Android 版本的几种设备类型上。由于它已经发生了很长时间,我怀疑它与 API 版本有任何关系,因为自第一次出现以来我已经更新了几次。

有没有人遇到同样的问题并且能够解决?

这是堆栈跟踪:

java.util.ArrayList.get (ArrayList.java:437)
android.view.ViewTreeObserver$CopyOnWriteArray$Access.get (ViewTreeObserver.java:1267)
android.view.ViewTreeObserver.dispatchOnGlobalLayout (ViewTreeObserver.java:1056)
android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:2823)
android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1857)
android.view.ViewRootImpl$TraversalRunnable.run (ViewRootImpl.java:8089)
android.view.Choreographer$CallbackRecord.run (Choreographer.java:1057)
android.view.Choreographer.doCallbacks (Choreographer.java:875)
android.view.Choreographer.doFrame (Choreographer.java:776)
android.view.Choreographer$FrameDisplayEventReceiver.run (Choreographer.java:1042)
android.os.Handler.handleCallback (Handler.java:888)
android.os.Handler.dispatchMessage (Handler.java:100)
android.os.Looper.loop (Looper.java:213)
android.app.ActivityThread.main (ActivityThread.java:8178)
java.lang.reflect.Method.invoke (Method.java)
com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:513)
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1101)

这些是我的应用包含的 API:

implementation 'androidx.multidex:multidex:2.0.1'
implementation 'androidx.core:core:1.5.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel:2.3.1'
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'com.google.android.material:material:1.3.0'
implementation 'com.android.billingclient:billing:4.0.0'
implementation 'com.google.android.gms:play-services-base:17.6.0'
implementation 'com.google.android.gms:play-services-basement:17.6.0'
implementation 'com.google.android.gms:play-services-games:21.0.0'
implementation 'com.google.android.gms:play-services-auth:19.0.0'
implementation 'androidx.room:room-runtime:2.3.0'
implementation 'androidx.lifecycle:lifecycle-process:2.3.1'
implementation 'com.google.code.gson:gson:2.8.6'
// Monetarization
implementation 'com.google.android.gms:play-services-ads:20.1.0'
implementation 'com.google.android.gms:play-services-ads-identifier:17.0.1'
// Ad mediation
implementation 'com.google.android.ads.consent:consent-library:1.0.8'
implementation 'com.google.ads.mediation:unity:3.6.0.0'
implementation 'com.google.ads.mediation:facebook:6.4.0.0'
// Firebase
implementation 'com.google.firebase:firebase-analytics:19.0.0'
implementation 'com.google.firebase:firebase-ads:20.1.0'
implementation 'com.google.firebase:firebase-core:19.0.0'
implementation 'com.google.firebase:firebase-auth:21.0.1'
implementation 'com.google.firebase:firebase-appindexing:20.0.0'
implementation 'com.google.firebase:firebase-crashlytics:18.0.0'
implementation 'com.google.firebase:firebase-config:21.0.0'
// Dagger
implementation 'com.google.dagger:dagger-android:2.35.1'
implementation 'com.google.dagger:dagger-android-support:2.33'

最佳答案

经过几天的调查并向 Crashlytics 添加了大量调试日志,我终于找到了崩溃的原因。

就我而言,这是由 Google Play 游戏引起的。 我调用:

Games.getGamesClient(context, account).setViewForPopups(gameContentView);

紧随其后的是“正在加载”Dialog 的显示,它在屏幕上停留了大约 2 秒。

在极少数情况下,我猜测由 Games 库(异步)执行的 onGlobalLayoutListener 添加或删除与 Dialog 管理触发的类似操作同时发生 由 Android 开发,最终导致崩溃。

修复:我将对 setViewForPopups() 的调用移到了另一个极不可能发生并发 UI 更改的地方。

关于android - ViewTreeObserver 中的 IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67821711/

相关文章:

java - 如何检查 keystore 文件中的证书名称和别名?

android - ClassCastException android.widget.AbsListView$LayoutParams 到 android.widget.GridLayout$LayoutParams 此异常是否特定于 API 级别?

android - 如何使 UI 阴影到任何 View

android - 插页式广告显示黑色 (->) AFMA_ReceiveMessage 未定义 ( :1)

java - 修复 ArrayList 中的 IndexOutOfBounds 异常

java - 我需要有关 java.lang.IndexOutOfBoundsException - ArrayList 的帮助

android - Espresso 测试无法在某些设备上单击 DialogBu​​tton

ios - Admob 广告与 Firebase 集成问题

android - 如何在应用程序关闭时显示插页式广告?

java - br.readLine() = ","时生成 ArrayIndexOutOfBoundsException