关于百度地图API OnGetGeoCoderResultListener 导致的内存泄露问题
OnGetGeoCoderResultListener 所有类似的监听器都可以如此尝试。虽然写法大差不差,但是还是要多测试。
geoListener 如果不销毁,就会一直持有GeoListener 的 activity ,导致整个Activity不能释放。
private GeoCoder geoCoder; private GeoListener geoListener;
geoCoder = GeoCoder.newInstance(); geoListener = new GeoListener(this); geoCoder.setOnGetGeoCodeResultListener(geoListener);
private static class GeoListener implements OnGetGeoCoderResultListener {
private WeakReference<Activity> weakReference;
private RiderPositionActivity activity;
public GeoListener(Activity activity) {
weakReference = new WeakReference<>(activity);
this.activity = (RiderPositionActivity) weakReference.get();
}
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
//没有找到检索结果
if (activity.mTvLocateAd != null) {
activity.mTvLocateAd.setText("没有获取到该地址");
activity.mTvLocateAd.setTextColor(Color.RED);
}
} else {
//详细地址
String address = reverseGeoCodeResult.getAddress();
if (activity.mTvLocateAd != null) {
activity.mTvLocateAd.setText(address);
}
}
}
//一开始的时候,我没有写这句,还是一直出现泄露的情况(加上这句就好了)。
private void onDestroy(){
if(activity!=null){
activity=null;
}
}
}
@Override
protected void onDestroy() {
// 关闭定位图层
if (mBaiduMap != null) {
mBaiduMap.setMyLocationEnabled(false);
}
if (geoCoder != null) {
geoCoder.destroy();
}
if (geoListener != null) {
geoListener.onDestroy();
geoListener = null;
}
if (mMapView != null) {
mMapView.onDestroy();
mMapView = null;
}
super.onDestroy();
}
我就简单地把代码上传了。网上有很多类似的解析,只是没有释放的代码。