Android Google Maps API V2 内存溢出异常

4

我有一个数据列表视图,每个项目都会打开一个嵌入地图的视图。这张地图的目的是显示一个单一标记。代码运行良好,但如果我有很多列表项(50+),来回滑动会导致应用程序抛出OutOfMemory异常。

有人能帮助我理解我在这里做错了什么吗?我猜想我的地图初始化逻辑有问题,导致这种情况发生。现在我正在尝试找出其中的问题。

public class DetailView extends Fragment implements OnInfoWindowClickListener {

    private MapView mMapView;
    private GoogleMap googleMap;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
            Bundle savedInstanceState) {

            mMapView = (MapView) v.findViewById(R.id.mapBusinessLocation);
            mMapView.onCreate(savedInstanceState);
            mMapView.onResume();//needed to get the map to display immediately

            MapsInitializer.initialize(this.getActivity() );
            //MapController myMapController = mMapView.getController();
            googleMap = mMapView.getMap();
            googleMap.setMyLocationEnabled(true);
            CameraUpdate center=
                    CameraUpdateFactory.newLatLng(new LatLng(-20.269927,57.672729)); 
             CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);

            googleMap.moveCamera(center);
            googleMap.animateCamera(zoom); 
    }

       @Override
        public void onActivityCreated(Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);

        placeMarker("test");

        }

        private Marker placeMarker(String title) {
            //Get the hue
            String pinColor = "#f29217";    
            int c = Color.parseColor(pinColor);
            float[] pixelHSV = new float[3];
            Color.colorToHSV(c, pixelHSV);
            return googleMap.addMarker(new MarkerOptions()
             .position(new LatLng(-20.269927,57.672729 ))
             .title(title)
             .snippet("")
             .icon(BitmapDescriptorFactory.defaultMarker(pixelHSV[0])));
        }
           @Override
        public void onResume() {
            super.onResume();

                if(mMapView != null) {
                mMapView.onResume();
                }
        }

        @Override
        public void onPause() {
            super.onPause();

                if(mMapView != null) {
                mMapView.onPause();
                }
        }

        @Override
        public void onDestroy() {
            super.onDestroy();

                if(mMapView != null) {
                mMapView.onDestroy();
                }

        }

        @Override
        public void onLowMemory() {
            super.onLowMemory();

                if(mMapView != null) {
                mMapView.onLowMemory();
                }
        }

}

当应用程序崩溃时,会给出以下堆栈跟踪信息...
    PP_VERSION_CODE=53
    ANDROID_VERSION=4.3
    PHONE_MODEL=GT-I9505
    CUSTOM_DATA=
    STACK_TRACE=java.lang.OutOfMemoryError
    at android.graphics.Bitmap.nativeCreate(Native Method)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:726)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:703)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:670)
    at maps.al.k.a(Unknown Source)
    at maps.as.b.a(Unknown Source)
    at maps.as.b.a(Unknown Source)
    at maps.as.b.b(Unknown Source)
    at maps.au.al.a(Unknown Source)
    at maps.au.at.a(Unknown Source)
    at maps.ay.ap.a(Unknown Source)
    at maps.ap.f.a(Unknown Source)
    at maps.ap.f.b(Unknown Source)
    at maps.aj.y.l(Unknown Source)
    at maps.aj.y.run(Unknown Source)

    LOGCAT=03-03 16:26:47.204 E/dalvikvm-heap(15112): Out of memory on a 4194320-byte allocation.
    03-03 16:26:47.204 I/dalvikvm(15112): "GLThread 911" prio=5 tid=29 RUNNABLE
    03-03 16:26:47.204 I/dalvikvm(15112):   | group="main" sCount=0 dsCount=0 obj=0x478125e0 self=0x79d89680
    03-03 16:26:47.204 I/dalvikvm(15112):   | sysTid=15717 nice=1 sched=0/0 cgrp=apps handle=1982454736
    03-03 16:26:47.204 I/dalvikvm(15112):   | state=R schedstat=( 0 0 0 ) utm=47 stm=8 core=1
    03-03 16:26:47.204 I/dalvikvm(15112):   at android.graphics.Bitmap.nativeCreate(Native Method)
    03-03 16:26:47.204 I/dalvikvm(15112):   at android.graphics.Bitmap.createBitmap(Bitmap.java:726)
    03-03 16:26:47.204 I/dalvikvm(15112):   at android.graphics.Bitmap.createBitmap(Bitmap.java:703)
    03-03 16:26:47.204 I/dalvikvm(15112):   at android.graphics.Bitmap.createBitmap(Bitmap.java:670)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.al.k.a((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.as.b.a((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.as.b.a((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.as.b.b((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.au.al.a((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.au.at.a((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.ay.ap.a((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.ap.f.a((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.ap.f.b((null):-1)
    03-03 16:26:47.204 I/dalvikvm(15112):   at maps.aj.y.l((null):-1)

03-03 16:26:47.204 I/dalvikvm(15112):   at maps.aj.y.run((null):-1)
1个回答

0

SDK 10 是 Android 2.3.3。因此,位图与3.0及更高版本的处理方式不同。请阅读链接或在 Google 上查找“Bitmap clean Android”以获得适当的答案。 - Alex van den Hoogen
谢谢,这个方法有效。我猜可以将minSdkVersion提高到ICS了。只有20%的人使用GingerBread,而且那些手机也无法很好地运行地图。 :) - Sharath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接