GoogleMap.addGroundOverlay()占用了大量的UiThread时间

时间:2015-06-08 17:43:43

标签: android google-maps android-anr-dialog

我有一个ArrayList:

ArrayList<GroundOverlayOptions> goArray;

- ca. 2-3k的元素。 当我尝试这样显示时:

for (GroundOverlayOptions temp : goArray) {
   map.addGroundOverlay(temp);
}

需要大量的UiThread时间(大约10-15秒)并且它会产生ANR错误。 map.addGroudOverlay()必须在UiThread上运行。 有没有解决方法呢?

goArray的内容:

float longitude, float latitude, float width,float height, int color
{
final Bitmap bitmap = Bitmap
            .createBitmap(1, 1, Bitmap.Config.ARGB_8888);
    bitmap.setPixel(0, 0, color);
    final BitmapDescriptor image = BitmapDescriptorFactory
            .fromBitmap(bitmap);
    final LatLngBounds bounds = new LatLngBounds(new LatLng(latitude
            - height / 2, longitude - width / 2), new LatLng(latitude
            + height / 2, longitude + width / 2));
    long startTime = System.currentTimeMillis();
    GroundOverlayOptions go = new GroundOverlayOptions().image(image)
            .positionFromBounds(bounds).transparency(0.33f);
    goArray.add(go);
}

1 个答案:

答案 0 :(得分:0)

为什么不尝试 AsyncTask 来做这件事?

private class MapTask extends AsyncTask<GroundOverlayOptions, Integer, Void> {
    protected Void onPreExecute() {
        //Use something like ProgressBar to keep user informed
    }

    protected Void doInBackground(GroundOverlayOptions... maps) {
        //Will need to use maps[0] 
        //because that method treat this param as an Array
        for (GroundOverlayOptions temp : maps[0]) {
            map.addGroundOverlay(temp);
        }

        return null;
    }

    protected void onProgressUpdate(Integer... progress) {
        //Update ProgressBar
    }
 }

执行循环调用的地方 AsyncTask 来处理此问题。 将 goArray 传递给 AsyncTask

new MapTask().execute(goArray);