java.lang.OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины, даже если я не использую изображение - PullRequest
0 голосов
/ 10 июня 2011

У меня возникла проблема в приложении, с которой я никогда не сталкивался. У меня было это приложение какое-то время, и я запускал его тысячи раз, но у меня никогда не было этой ошибки.

У меня естьсервер, который получает некоторые данные GPS, которые также записаны в БД и в одноэлементном классе.В одном из моих классов я использую поток Async Task, чтобы прочитать из синглтон-класса новые поступившие данные GPS и отобразить эти точки на карте.

И теперь внезапно я получаю ошибку в такой строке:

mc.animateTo(p1);

where mc=mapView.getController();

Вот так выглядит мой код:

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

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

    mapView.setBuiltInZoomControls(true);

    mc = mapView.getController();

    mc.setZoom(17);

    mapView.setSatellite(true);

    mapView.setStreetView(true);

    mapView.invalidate();
}


public class InitTask extends AsyncTask<Void, GeoPoint, Void> {

    GeoPoint p;

    protected Void doInBackground(Void... voids) {

        try {

            while (true) {


                if(number.equals("Car1"))
                {
                longitude = ServerManager.getInstance().getLastLongitude1();
                latitude = ServerManager.getInstance().getLastLatitude1();
                speed = ServerManager.getInstance().getLastSpeed1();
                loc1 = ServerManager.getInstance().getLastLocation1();
                speed = ServerManager.getInstance().getLastSpeed1();
                }



                runOnUiThread(new Runnable() {
                    public void run() {
                        speed_1.setText(Integer.toString(speed));
                        location.setText(loc1);

                    }
                });


                p = new GeoPoint(latitude, longitude);

                publishProgress(p);

                Thread.sleep(1500);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onProgressUpdate(GeoPoint... progress1) {

        theRouteDraw(progress1[0]);
    }

Вот так выглядит theRouteDraw ():

public void theRouteDraw(GeoPoint p1) {

    mc.animateTo(p1);

    mc.setZoom(17);

    mapView.setSatellite(true);

    mapView.invalidate();
}

ServerManager - мой одноэлементный класс... я читаю новые данные оттуда и использую publishProgress ();и метод theRouteDraw () для отображения этих точек на карте.

Я не использую какие-либо наложения или специальные изображения на своей карте.

В этом методе я получаю ошибку

public void theRouteDraw(GeoPoint p1) {

    public void theRouteDraw(GeoPoint p1) {

    mc.animateTo(p1);

    mc.setZoom(17);

    mapView.setSatellite(true);

    mapView.invalidate();
}

в этой строке: mc.animateTo (p1);

Это мой logcat:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
at com.google.android.maps.StreetViewRenderer.generateNewTileImage(StreetViewRenderer.java
at com.google.android.maps.StreetViewRenderer.renderTile(StreetViewRenderer.java:88)
at com.google.android.maps.AndroidTileOverlayRenderer.renderTile(AndroidTileOverlayRenderer.) 
at com.google.googlenav.map.Map.drawTile(Unknown Source)
at com.google.googlenav.map.Map.drawMapBackground(Unknown Source)
at com.google.googlenav.map.Map.preLoad(Unknown Source)
at com.google.android.maps.MapController.animateTo(MapController.java:234)
at com.google.android.maps.MapController.animateTo(MapController.java:203)
at com.Server_1.Server4.theRouteDraw(Server4.java:159)

1 Ответ

0 голосов
/ 13 октября 2011

Плитки изображений карт Google являются растровыми изображениями, а карты Google также кэшируют некоторые изображения, поэтому выделяются растровые изображения. У меня похожие проблемы.

В этом случае удаление:

mc.animateTo(p1);

Вероятно, это решит проблему, это, похоже, приводит к ошибке, и имеет смысл, что это может включать загрузку нескольких изображений. Возможно, где-то произошла утечка памяти, возможно, ссылка на ваше представление карты, которое является корнем проблемы.

...