qiuxiang / react-native-baidumap-sdk

React Native BaiduMap SDK for Android + iOS
MIT License
330 stars 71 forks source link

部分android机型初始化时导致崩溃闪退 #140

Open yangbo5207 opened 6 years ago

yangbo5207 commented 6 years ago

image

使用bugly获取到的日志如下:

java.lang.RuntimeException

Illegal callback invocation from native module. This callback type only permits a single invocation from native code.

java.lang.RuntimeException:Error receiving broadcast Intent { act=permission check ok flg=0x800010 } in cn.qiuxiang.react.baidumap.modules.BaiduMapInitializerModule$SDKReceiver@b4ab587
--
2 android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:974)
3 ......
4 Caused by:
5 java.lang.RuntimeException:Illegal callback invocation from native module. This callback type only permits a single invocation from native code.
6 com.facebook.react.bridge.CallbackImpl.invoke(CallbackImpl.java:30)
7 com.facebook.react.bridge.PromiseImpl.resolve(PromiseImpl.java:32)
8 cn.qiuxiang.react.baidumap.modules.BaiduMapInitializerModule$SDKReceiver.onReceive(BaiduMapInitializerModule.kt:19)
9 android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:957)
10 android.os.Handler.handleCallback(Handler.java:739)
11 android.os.Handler.dispatchMessage(Handler.java:95)
12 android.os.Looper.loop(Looper.java:179)
13 android.app.ActivityThread.main(ActivityThread.java:5769)
14 java.lang.reflect.Method.invoke(Native Method)
15 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
16 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)

大概能够定位到的问题代码是在BaiduMapInitializerModule这个模块里,如下19行,具体为什么还不太清楚,希望大佬能够帮助解决一下

image

qiuxiang commented 6 years ago

大致上知道什么什么导致的,要完全修正这个问题,要改初始化接口的调用方式才行

yangbo5207 commented 6 years ago

@qiuxiang 可以先大概指导一下修改思路吗,线上的bug比较着急 ~ ~

qiuxiang commented 6 years ago

原因是因为 promise 只能调用一次 resolve 或 reject,可能在某种情况下,一次初始化操作会触发 1 次以上的广播,这时候,第二次 resolve 或 reject 就会出错。最佳的解决方法是,Initializer 提供广播事件,而不是 promise 回调,但如果你要快速解决崩溃的问题,给 onReceive 里面的代码加上 try catch 就可以了,至少不会崩溃,但 promise 返回的状态就是不准的,不过在保证 key 没有问题的情况下,可以认为 init 总是成功的。