如何在没有ArrayIndexOutOfBoundsException的情况下从AsyncTask更新MapView覆盖项

时间:2012-01-05 14:58:38

标签: android android-mapview

我正在使用MapView,它需要添加一些叠加项。我发现添加叠加项很慢并且在拖动时会导致地图变为ANR。所以我构建了一个AsyncTask来添加叠加项。最初我发现它一直失败,因为我从后台线程访问覆盖集合,我收集它不是线程安全的。所以我更改了它,因此只能从UI线程更改叠加层。它现在有效,但只有大部分时间。触摸地图时,它仍会偶尔崩溃。

这是AsyncTask(我的MapView子类中的内部类):

class showItemsTask extends AsyncTask<Void, User, Void> {

public boolean stop = false;

@Override
protected void onPreExecute() {
    super.onPreExecute();
}

protected Void doInBackground(Void... v) {
    User[] items = Item.getItemList();
    if (items != null && items.length > 0) {
        int i = 0;
        for (User item : items) {
            publishProgress(item);
            i++;
            if (stop || i>MAX_NUMBER_OF_ITEMS) break;
        }
        stop = false;
    }
    return null;
}

@Override
protected void onProgressUpdate(User... itemContainer) {
    super.onProgressUpdate(itemContainer);
    User item = itemContainer[0];
    showItem(item.location.latitude, item.location.longitude, item.location.firstname, ((Integer) item.location.id).toString());
}

public void showItem(float latitude, float longitude, String itemTitle, String itemSubtitle) {
    try {
        GeoPoint point = new GeoPoint((int) (latitude * 1000000), (int) (longitude * 1000000));
        OverlayItem marker = new OverlayItem(point, itemTitle, itemSubtitle);
        availableItemsOverlay.addOverlay(marker);
    } catch (Exception e) {
        Trace.e(TAG, "Exception drawing a item");
    }
}

protected void onPostExecute(Void v) {
    invalidate();
}


}

这是堆栈跟踪:

0   java.lang.ArrayIndexOutOfBoundsException
1   at com.google.android.maps.ItemizedOverlay.maskHelper(ItemizedOverlay.java:562)
2   at com.google.android.maps.ItemizedOverlay.setFocus(ItemizedOverlay.java:365)
3   at com.google.android.maps.ItemizedOverlay.focus(ItemizedOverlay.java:539)
4   at com.google.android.maps.ItemizedOverlay.onTap(ItemizedOverlay.java:455)
5   at com.google.android.maps.OverlayBundle.onTap(OverlayBundle.java:83)

我是否会使用AsyncTask走错路?如果没有,当你在UI线程中对叠加层进行所有更改时,你能看到我为什么会遇到这个异常吗?

2 个答案:

答案 0 :(得分:0)

我认为你必须在更新叠加层后调用地图视图的postInvaliadate()(availableItemsOverlay.addOverlay(marker)之后)。

答案 1 :(得分:0)

虽然onProgressUpdate() runs on the UI thread我不确定是否可以添加叠加项目。相反,我建议在onPostExecute()中添加叠加层。 add()操作并不昂贵,因为此时已经生成了项目列表。

@Override
protected void onPostExecute(List<OverlayItem> overlay) {
  mMapView.getOverlays().add(overlay);
  mMapView.invalidate();
}

您需要将AsyncTask的签名更改为AsyncTask<Void, User, List<OverlayItem>>才能匹配该方法。