首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ItemizedOverlay中的ArrayIndexOutOfBoundsException

ItemizedOverlay中的ArrayIndexOutOfBoundsException
EN

Stack Overflow用户
提问于 2011-11-24 23:09:48
回答 3查看 2.1K关注 0票数 3

我有一个上面有很多覆盖标记的MapView。这是一种工作,但当添加标记时,它倾向于ANR,因为有很多标记。所以我把代码移到了一个AsyncTask中。一旦移动,代码就会中断,当渲染完成时,以下异常会从框架中冒出来。错误似乎是间歇性的,但覆盖项越多,它发生的频率就越高。

是什么导致了异常?我该如何解决这个问题呢?

代码语言:javascript
复制
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)

这是我的班级:

代码语言:javascript
复制
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();
}

}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-25 00:38:33

对项目列表的访问不应该在UI线程上完成吗?也许是在onPostProgress期间?

以及onPreExecute期间的clearMarkersFromMap()?

票数 5
EN

Stack Overflow用户

发布于 2011-11-25 01:24:30

正如人们所建议的那样,当数组在其他地方使用时,不要尝试玩它。在这种情况下,不要试图在标记被处理时显示它们(你可以这样做,但我建议以后一旦它工作了就对它进行改进),全部显示然后显示结果:

代码语言:javascript
复制
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);
        }

        }
    }
票数 0
EN

Stack Overflow用户

发布于 2011-11-24 23:36:33

你不应该更新一个任务中的数组,如果它同时在其他地方使用。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8259176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档