前段时间因为项目中有需要用到百度Android SDK中的反地址查询,因此使用了Android SDK。
开始阶段一切顺利,没出现什么问题,可以顺利通过经纬度进行反地址的查询并查到详细的地址信息,但是后来经过详细的反复测试发现一个问题,那就是会有概率出现应用程序启动时CPU占用会逐渐上升到50%左右,通过top可以查询并跟踪到线程名为Tmcom_socket的线程时钟占用CPU。但是后来由于没找到更详尽的方法来确定此线程是在什么地方开启,由什么开启的。于是采用了一个比较笨拙的办法,即逐段代码排除。
最后排查到SDK初始的部分,基本确定了是由初始化造成的。贴出百度开发指南中的初始化实例:
第五步:初始化地图Activity、使用Key:
在MyMapActivity中定义成员变量:
- BMapManager mBMapMan = null;
- MapView mMapView = null;
在onCreate方法中增加以下代码,并将您申请的开发密钥替换“我的Key”
- super.onCreate(savedInstanceState);
- mBMapMan=new BMapManager(getApplication());
- mBMapMan.init(null);
- //注意:请在试用setContentView前初始化BMapManager对象,否则会报错
- setContentView(R.layout.activity_main);
- mMapView=(MapView)findViewById(R.id.bmapsView);
- mMapView.setBuiltInZoomControls(true);
- //设置启用内置的缩放控件
- MapController mMapController=mMapView.getController();
- // 得到mMapView的控制权,可以用它控制和驱动平移和缩放
- GeoPoint point =new GeoPoint((int)(39.915* 1E6),(int)(116.404* 1E6));
- //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
- mMapController.setCenter(point);//设置地图中心点
- mMapController.setZoom(12);//设置地图zoom级别
可以看到初始化中会new一个BMapManager对象,并且紧跟着会进行初始化这个对象。这个init函 数具体做什么操作尚无法得知,但是可以肯定的是此操作是取应用申请到的key来进行验证授权,因此可以确定此步骤需要进行网络连接来验证。但是问题恰好在此出现,因为我所测试的时候并未连接网络,由此可猜测此处的Socket线程就是在无网络的时候阻塞的。引起此问题的原因是网络未连接,但是socket线程并不知道服务器端已经断开连接,而进行反复的连接从而占用了CPU,后来也曾试过做超时处理,但是始终没法解决,最后不得已进行了网络状况的判断来执行初始化。但是这样做的弊端可能就是在无网络的时候无法初始化此对象,从而导致后来联网后反地址查询也无法使用,必须在联网后重启应用才可以。
另需特别注意的是,这部分初始化的操作百度要求要在setContentView之前做否则会有异常出现,由此也会增加不少应用的局限性。