我有一个上面有很多覆盖标记的MapView。这是一种工作,但当添加标记时,它倾向于ANR,因为有很多标记。所以我把代码移到了一个AsyncTask中。一旦移动,代码就会中断,当渲染完成时,以下异常会从框架中冒出来。错误似乎是间歇性的,但覆盖项越多,它发生的频率就越高。
是什么导致了异常?我该如何解决这个问题呢?
11-24 12:40:44.316: ERROR/AndroidRuntime(6607): FATAL EXCEPTION: main
java.lang.ArrayIndexOutOfBoundsException: length=0; index=2
at com.google.android.maps.ItemizedOverlay.getIndexToDraw(ItemizedOverlay.java:211)
at com.google.android.maps.ItemizedOverlay.draw(ItemizedOverlay.java:240)
at com.company.myapp.MyOverlay.draw(TaxiOverlay.java:43)
at com.google.android.maps.Overlay.draw(Overlay.java:179)
at com.google.android.maps.OverlayBundle.draw(OverlayBundle.java:42)
at com.google.android.maps.MapView.onDraw(MapView.java:530)
at android.view.View.draw(View.java:10982)
at android.view.ViewGroup.drawChild(ViewGroup.java:2899)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
at android.view.ViewGroup.drawChild(ViewGroup.java:2897)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
at android.view.ViewGroup.drawChild(ViewGroup.java:2897)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
at android.view.ViewGroup.drawChild(ViewGroup.java:2897)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
at android.view.ViewGroup.drawChild(ViewGroup.java:2897)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
at android.view.ViewGroup.drawChild(ViewGroup.java:2897)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
at android.view.ViewGroup.drawChild(ViewGroup.java:2897)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2495)
at android.view.View.draw(View.java:10883)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2106)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2005)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1613)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2418)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4340)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
at dalvik.system.NativeStart.main(Native Method)这是我的班级:
public class MarkersMapView extends MapView {
public void showMarkers() {
new showMarkersTask().execute();
}
public void clearMarkersFromMap() {
this.getOverlays().remove(markersOverlay);
Drawable drawable = this.getResources().getDrawable(R.drawable.ic_map_marker);
markersOverlay = new MarkerOverlay(drawable, this);
getOverlays().add(availableMarkersOverlay);
}
class showMarkersTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... voids) {
showTheMarkers();
return null;
}
protected void onProgressUpdate(Void v) {
invalidate();
}
protected void onPostExecute(Void v) {
}
private void showTheMarkers() {
Marker[] markers = Marker.getMarkerList();
if (markers == null || markers.length == 0) return;
clearMarkersFromMap();
for (User marker : markers) {
showMarker(marker.location.latitude, marker.location.longitude, marker.location.title, marker.location.subtitle);
publishProgress();
}
}
public void showMarker(float latitude, float longitude, String markerTitle, String markerSubtitle) {
GeoPoint point = new GeoPoint((int) (latitude * 1000000), (int) (longitude * 1000000));
OverlayItem marker = new OverlayItem(point, markerTitle, markerSubtitle);
markersOverlay.addOverlay(marker);
MarkerMapView.this.postInvalidate();
}
}
}发布于 2011-11-25 00:38:33
对项目列表的访问不应该在UI线程上完成吗?也许是在onPostProgress期间?
以及onPreExecute期间的clearMarkersFromMap()?
发布于 2011-11-25 01:24:30
正如人们所建议的那样,当数组在其他地方使用时,不要尝试玩它。在这种情况下,不要试图在标记被处理时显示它们(你可以这样做,但我建议以后一旦它工作了就对它进行改进),全部显示然后显示结果:
public class MarkersMapView extends MapView {
public void showMarkers() {
new showMarkersTask().execute();
}
public void clearMarkersFromMap() {
this.getOverlays().remove(markersOverlay);
Drawable drawable = this.getResources().getDrawable(R.drawable.ic_map_marker);
markersOverlay = new MarkerOverlay(drawable, this);
}
class showMarkersTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... voids) {
showTheMarkers();
return null;
}
@Override
protected void onPreExecute()
{
clearMarkersFromMap();
}
protected void onPostExecute(Void v) {
getOverlays().add(markersOverlay);
}
private void showTheMarkers() {
Marker[] markers = Marker.getMarkerList();
if (markers == null || markers.length == 0) return;
for (User marker : markers) {
showMarker(marker.location.latitude, marker.location.longitude, marker.location.title, marker.location.subtitle);
}
}
public void showMarker(float latitude, float longitude, String markerTitle, String markerSubtitle) {
GeoPoint point = new GeoPoint((int) (latitude * 1000000), (int) (longitude * 1000000));
OverlayItem marker = new OverlayItem(point, markerTitle, markerSubtitle);
markersOverlay.addOverlay(marker);
}
}
}发布于 2011-11-24 23:36:33
你不应该更新一个任务中的数组,如果它同时在其他地方使用。
https://stackoverflow.com/questions/8259176
复制相似问题