如何解决Android Mapview内存不足异常
| 我的应用程序中有一个mapview,每当用户进行过多的放大或缩小时,mapview都会崩溃。以下是崩溃发生时我从DDMS获得的数据分配:486 17971 byte[] 1 com.google.common.io.android.AndroidPersistentStore readBlock
422 17966 byte[] 1 com.google.common.io.android.AndroidPersistentStore readBlock
349 17963 byte[] 1 com.google.common.io.android.AndroidPersistentStore readBlock
244 17958 byte[] 1 com.google.common.io.android.AndroidPersistentStore readBlock
172 17935 byte[] 1 com.google.common.io.android.AndroidPersistentStore readBlock
102 17886 byte[] 1 com.google.common.io.android.AndroidPersistentStore readBlock
96 9526 byte[] 1 com.google.googlenav.map.MapTile read
64 9526 byte[] 1 com.google.googlenav.map.MapTile read
481 9268 byte[] 1 com.google.googlenav.map.MapTile read
462 9268 byte[] 1 com.google.googlenav.map.MapTile read
345 9058 byte[] 1 com.google.googlenav.map.MapTile read
289 9058 byte[] 1 com.google.googlenav.map.MapTile read
418 8994 byte[] 1 com.google.googlenav.map.MapTile read
400 8994 byte[] 1 com.google.googlenav.map.MapTile read
236 8808 byte[] 1 com.google.googlenav.map.MapTile read
164 8421 byte[] 1 com.google.googlenav.map.MapTile read
92 8351 byte[] 1 com.google.googlenav.map.MapTile read
479 8076 byte[] 1 com.google.googlenav.map.MapTile read
416 7779 byte[] 1 com.google.googlenav.map.MapTile read
240 7682 byte[] 1 com.google.googlenav.map.MapTile read
219 7682 byte[] 1 com.google.googlenav.map.MapTile read
166 7468 byte[] 1 com.google.googlenav.map.MapTile read
147 7468 byte[] 1 com.google.googlenav.map.MapTile read
342 7415 byte[] 1 com.google.googlenav.map.MapTile read
15 4920 long[] 22 com.google.googlenav.map.MapService
我只有一个叠加层,即自定义叠加层
公共类ProfilesOverlay扩展了Overlay {
private static final String TAG=\"ProfilesOverlay\";
private Paint paintCircle;
private Paint paintText;
private Bitmap heartIcon;
boolean multitouchGesture;
boolean showCounts;
public interface ProfilesOverlayDelegate {
public List<OverlayInfo> getoverlayInfo();
public void onOverlayTouched();
public boolean onOverlayTapped(GeoPoint p);
}
ProfilesOverlayDelegate delegate;
public ProfilesOverlay(ProfilesOverlayDelegate delegate,Resources res,boolean showCounts) {
this.delegate = delegate;
this.showCounts = showCounts;
paintCircle = new Paint();
paintCircle.setColor(res.getColor(R.color.mapProfileClusterCircle));
paintCircle.setAntiAlias(true);
heartIcon = BitmapFactory.decodeResource(res,R.drawable.flirtplace_white);
paintText = new Paint();
paintText.setColor(Color.WHITE);
paintText.setTypeface(Typeface.DEFAULT_BOLD);
paintText.setTextSize((float)(heartIcon.getHeight() * 0.7));
paintText.setAntiAlias(true);
}
@Override
public void draw(Canvas canvas,MapView map,boolean shadow) {
Projection projection = map.getProjection();
Point point = new Point();
int heartWidth = heartIcon.getWidth();
int heartHeight = heartIcon.getHeight();
for (OverlayInfo overlay : delegate.getoverlayInfo()) {
projection.toPixels(overlay.getGeoPoint(),point);
if(isLocationVisible(point,map)){
paintCircle.setAlpha(overlay.getAlphs());
canvas.drawCircle(point.x,point.y,(int) overlay.geTradius(),paintCircle);
canvas.drawBitmap(heartIcon,point.x - heartWidth/2,point.y - heartHeight / 2,null);
if(showCounts) {
canvas.drawText(Integer.toString(overlay.getCount()),point.x + heartWidth - App.dp(6),point.y + App.dp(4),paintText);
}
}
}
super.draw(canvas,map,shadow);
}
@Override
public boolean onTouchEvent(MotionEvent event,MapView map) {
multitouchGesture = event.getPointerCount()>1;
delegate.onOverlayTouched();
return super.onTouchEvent(event,map);
}
@Override
public boolean onTap(GeoPoint p,MapView map) {
if (multitouchGesture) {
return false; //
}
return delegate.onOverlayTapped(p);
}
//check if given location is visible on the screen
private boolean isLocationVisible(Point point,MapView mapView)
{
Rect currentMapBoundsRect = new Rect();
mapView.getDrawingRect(currentMapBoundsRect);
return currentMapBoundsRect.contains(point.x,point.y);
}
}
我在活动中将其用作:
map = (MapView) findViewById(R.id.map);
map.getoverlays().add(new ProfilesOverlay(this,activity.getResources(),true));
堆栈跟踪非常常见:
06-13 17:27:49.479: ERROR/dalvikvm-heap(20267): 584640-byte external allocation too large for this process.
06-13 17:27:49.479: ERROR/dalvikvm(20267): Out of memory: Heap Size=10339KB,Allocated=9989KB,Bitmap Size=14057KB,Limit=21884KB
06-13 17:27:49.479: ERROR/dalvikvm(20267): Trim info: Footprint=11335KB,Allowed Footprint=11335KB,Trimmed=996KB
06-13 17:27:49.479: ERROR/GraphicsJNI(20267): VM won\'t let us allocate 584640 bytes
06-13 17:27:49.479: WARN/System.err(20267): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
06-13 17:27:49.479: WARN/System.err(20267): at android.graphics.Bitmap.nativeCreate(Native Method)
06-13 17:27:49.479: WARN/System.err(20267): at android.graphics.Bitmap.createBitmap(Bitmap.java:677)
06-13 17:27:49.479: WARN/System.err(20267): at com.google.android.maps.ZoomHelper.createSnapshot(ZoomHelper.java:444)
06-13 17:27:49.479: WARN/System.err(20267): at com.google.android.maps.ZoomHelper.beginZoom(ZoomHelper.java:194)
06-13 17:27:49.479: WARN/System.err(20267): at com.google.android.maps.MapView$2.onScaleBegin(MapView.java:371)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ScaleGestureDetector.onTouchEvent(ScaleGestureDetector.java:248)
06-13 17:27:49.489: WARN/System.err(20267): at com.google.android.maps.MapView.onTouchEvent(MapView.java:646)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.View.dispatchTouchEvent(View.java:3778)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:919)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:958)
06-13 17:27:49.489: WARN/System.err(20267): at com.android.internal.policy.impl.PhoneWindow$DecorView.superdispatchTouchEvent(PhoneWindow.java:1716)
06-13 17:27:49.489: WARN/System.err(20267): at com.android.internal.policy.impl.PhoneWindow.superdispatchTouchEvent(PhoneWindow.java:1124)
06-13 17:27:49.489: WARN/System.err(20267): at android.app.Activity.dispatchTouchEvent(Activity.java:2125)
06-13 17:27:49.499: WARN/System.err(20267): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1700)
06-13 17:27:49.499: WARN/System.err(20267): at android.view.ViewRoot.handleMessage(ViewRoot.java:1802)
06-13 17:27:49.499: WARN/System.err(20267): at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 17:27:49.499: WARN/System.err(20267): at android.os.Looper.loop(Looper.java:143)
06-13 17:27:49.499: WARN/System.err(20267): at android.app.ActivityThread.main(ActivityThread.java:5068)
06-13 17:27:49.499: WARN/System.err(20267): at java.lang.reflect.Method.invokeNative(Native Method)
06-13 17:27:49.499: WARN/System.err(20267): at java.lang.reflect.Method.invoke(Method.java:521)
06-13 17:27:49.499: WARN/System.err(20267): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-13 17:27:49.499: WARN/System.err(20267): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-13 17:27:49.499: WARN/System.err(20267): at dalvik.system.NativeStart.main(Native Method)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。