封装百度定位类BDLocationManager单例类,封装了一些启动定位,停止定位、注册监听、注销监听等的方法。大概代码是这样。
public class BDLocationManager{
private static BDLocationManager INSTANCE = null;
private BDLocationListener lastListener;
public synchronized static void init(Context context) {
if (INSTANCE == null) {
INSTANCE = new BDLocationManager(context.getApplicationContext());
}
}
public synchronized static BDLocationManager getInstance() {
return INSTANCE;
}
public void registerLocationListener(BDLocationListener listener) {
unRegisterLocationListener(lastListener);
if (locationClient != null && listener != null) {
locationClient.registerLocationListener(listener);
lastListener = listener;
}
}
public void unRegisterLocationListener(BDLocationListener listener) {
if (locationClient != null && listener != null) {
locationClient.unRegisterLocationListener(listener);
}
}
public void stop() {
unRegisterLocationListener(lastListener);
lastListener = null;
if (locationClient != null && locationClient.isStarted()) {
locationClient.stop();
}
}
}
使用BDLocationManager.getInstance().registerLocationListener()注册,回调定位结果。定位完成后调用stop()停止定位,停止定位注销了 unRegisterLocationListener(),BDLocationManager全局有效对lastListener 有引用,没有对lastListener 进行释放,导致调用定位的类没有被完全回收,造成内存泄漏。