Android Google Maps MapController утечки памяти - PullRequest
3 голосов
/ 07 марта 2012

Я получаю серьезную утечку памяти при использовании карт Google для Android.Особенно это заметно при использовании mapController.animateTo.См. Пример кода: начиная с Амстердама, я направляюсь на юг в сторону Италии, увеличивая значение latlng, но в течение 3 минут размер кучи превышает 20 МБ, #object увеличивается до 68000 или более, и приложение вылетает.Кто-нибудь знает, в чем может быть причина или есть обходной путь?

    public class MapsLeakActivity extends MapActivity 
    {
        MapView       mapView       = null;
        MapController mapController = null;
        Location      mLoc          = new Location("");
        GeoPoint      mGP           = null;

        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.mapsleak);

            mapView = (MapView) findViewById(R.id.mapviewml);

            mapView.setKeepScreenOn(true);
            mapView.setSatellite(false);
            mapView.setBuiltInZoomControls(false);

            mapController = mapView.getController();
            mapController.setZoom(17);

            // We start in Amsterdam
            mLoc.setLatitude(52.29);
            mLoc.setLongitude(5.09);

            Timer     timer  = new Timer();
            TimerTask moveOn = new TimerTask()
            {
                @Override
                public void run()
                {
                    // Italy here we come ;) (if it wasn't for the memoryleaking)
                    mLoc.setLatitude(mLoc.getLatitude() - 0.05);
                    mLoc.setLongitude(mLoc.getLongitude() + 0.05);
                    mGP = new GeoPoint((int)(mLoc.getLatitude() * 1E6), (int) (mLoc.getLongitude() * 1E6));
                    mapController.animateTo(mGP);

                 // System.gc();  Tried this already; does not help!
               }            
            };
            timer.schedule(moveOn , 1000, 2000);
        }

        @Override
        protected void onResume()
        {
            super.onResume();
        }

        @Override
        protected void onPause()
        {
            super.onPause();
        }

        @Override
        protected void onDestroy()
        {
            super.onDestroy();
        }

        @Override
        protected boolean isRouteDisplayed()
        {
            return (true);
        }
    }
...