情况:
我有A, B两个Activity, A和B都使用了百度地图之后,在A跳转到B后,偶然但又很经常的发生页面崩溃现象。而我查看logcat的时候,发现如下错误提示:
com.ym.fm/com.ym.fm.view.HomeActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x8
E/InputDispatcher( 329): channel '4207e010 com.ym.fm/com.ym.fm.view.HomeActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
I/ActivityManager( 329): Process com.ym.fm (pid 10074) has died.
I/WindowManager( 329): WIN DEATH: Window{43027710 com.ym.fm/com.ym.fm.view.HomeActivity paused=true}
W/InputDispatcher( 329): Attempted to unregister already unregistered input channel '4207e010 com.ym.fm/com.ym.fm.view.HomeActivity (server)'
I/WindowManager( 329): WIN DEATH: Window{4207e010 com.ym.fm/com.ym.fm.view.HomeActivity paused=true}
I/WindowManager( 329): WINDOW DIED Window{4207e010 com.ym.fm/com.ym.fm.view.HomeActivity paused=true}
I/WindowManager( 329): SCREENLAYOUT_SIZE (1:small, 2:normal, 3:large, 4:xlarge) 2
I/RenderThread( 664): RenderThread resumed
I/RenderThread( 664): RenderThread paused, waiting for signal
分析:
根据自己的情况,这些怪现象都是在使用了百度地图才出现的,所以就重点这部分代码。
从log可以看出,重点可以看这句 Consumer closed input channel or an error occurred. events=0x8 ,在网上一搜,才知道原来android的报错可读性比较差,出现这个错误提示,有可能是因为指针操作有误,例如我们在Activity的OnDestory做了某些置空操作,然而我们所置空的对象,有可能在其他的地方还有引用。
经过排查,果不出所料,因为我在A和B都有使用全局的百度地图管理类BMapManager的对象,我在A和B都有使用该对象,在A和B的OnDestroy都调用了置空操作,当A切换到B,B跳转到A的时候,B已经将BMapManager Destory掉了,A再调用的时候,就发生错误了,造成页面崩溃了。
解决:
根据百度的官方文档,BMapmanager的对象建议在程序推出的时候才去Destroy,例如:
@Override
public void onTerminate() {
//建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗
if (BMap_Manager != null) {
BMap_Manager.destroy();
BMap_Manager = null;
}
super.onTerminate();
}