EventBus找不到BackEvent导致崩溃(临时解决方法)
学的东西越多却发现知道的越少 路走的越久却发现还有很多路要走 努力那么久以为会有结果却方向反了
一、崩溃
收到用户反馈华为手机上有崩溃。很淡定想应该是鸿蒙系统升级了吧。不急、等鸿蒙系统修复吧。 看了下崩溃的日志
Caused by: java.lang.ClassNotFoundException: Didn't find class "android.window.BackEvent" on path: DexPathList[[zip file "/data/app/~~mItMJVtTKf3MFXkmzjJT5g==/com.qeebike.customer-sqio0Z6TRT4C2KWW30Nl8g==/base.apk"],nativeLibraryDirectories=[/data/app/~~mItMJVtTKf3MFXkmzjJT5g==/com.qeebike.customer-sqio0Z6TRT4C2KWW30Nl8g==/lib/arm64, /data/app/~~mItMJVtTKf3MFXkmzjJT5g==/com.qeebike.customer-sqio0Z6TRT4C2KWW30Nl8g==/base.apk!/lib/arm64-v8a, /system/lib64, /hw_product/lib64, /system/lib64/module/multimedia, /system/product/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.reflect.Executable.getParameterTypesInternal(Native Method)
at java.lang.reflect.Method.getParameterTypes(Method.java:186)
at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingReflectionInSingleClass(SubscriberMethodFinder.java:173)
at org.greenrobot.eventbus.SubscriberMethodFinder.findUsingInfo(SubscriberMethodFinder.java:88)
at org.greenrobot.eventbus.SubscriberMethodFinder.findSubscriberMethods(SubscriberMethodFinder.java:64)
at org.greenrobot.eventbus.EventBus.register(EventBus.java:150)
at com.qeebike.map.ui.activity.JourneyFinishActivity.onCreate(JourneyFinishActivity.kt:102)
at android.app.Activity.performCreate(Activity.java:8592)
at android.app.Activity.performCreate(Activity.java:8565)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1344)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4756)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:5006)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:123)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3082)
at android.os.Handler.dispatchMessage(Handler.java:117)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:293)
at android.app.ActivityThread.loopProcess(ActivityThread.java:9986)
at android.app.ActivityThread.main(ActivityThread.java:9975)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1240)
看到主要的原因是Didn't find class "android.window.BackEvent"
,这是系统的方法啊。触发这个问题的代码为
EventBus.getDefault().register(this)
二、查找原因
碰到这个问题的人,想法和我一样,第一时间觉得是flutter升级到最新版本3.22后引入的。结果也是。可是我在vivo测试机上,测试是正常的啊。在mate 60 pro中测试,就有
Didn't find class "android.window.BackEvent"
。反转的是所有问题都已经关闭了,但是问题还没有解决呢。
升级flutter到最新的3.22.2,以为会将问题解决吧。当然没有啊。
三、临时修复方案
开始想着用try...catch
来捕获一下异常吧。发现这个方法无效。
那只能是提前用java的反射判断下android.window.BackEvent
是否存在:
private fun findBackEvent(): Boolean {
try {
Class.forName("android.window.BackEvent")
return true
} catch (e: Throwable) {
return false
}
}
如果android.window.BackEvent
存在则注册EventBus,不然就不注册了。只是这样会导致收不到EventBus的通知的,影响功能。可没有想到其他的解决方法,已经在github上EventBus项目中留言,希望会有修复一下。
网上相关这个问题的答案比较少,抛砖引玉。!_!
转载自:https://juejin.cn/post/7377567987119210547