关于百度地图API OnGetGeoCoderResultListener 导致的内存泄露问题

OnGetGeoCoderResultListener 所有类似的监听器都可以如此尝试。虽然写法大差不差,但是还是要多测试。

geoListener 如果不销毁,就会一直持有GeoListener 的 activity ,导致整个Activity不能释放。

关于百度地图API OnGetGeoCoderResultListener 导致的内存泄露问题

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();
}

我就简单地把代码上传了。网上有很多类似的解析,只是没有释放的代码。