likes
comments
collection
share

EventBus找不到BackEvent导致崩溃(临时解决方法)

作者站长头像
站长
· 阅读数 57

学的东西越多却发现知道的越少 路走的越久却发现还有很多路要走 努力那么久以为会有结果却方向反了

一、崩溃

收到用户反馈华为手机上有崩溃。很淡定想应该是鸿蒙系统升级了吧。不急、等鸿蒙系统修复吧。 看了下崩溃的日志

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)

二、查找原因

EventBus找不到BackEvent导致崩溃(临时解决方法) 碰到这个问题的人,想法和我一样,第一时间觉得是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
评论
请登录