IllegalStateException when creating markers on goo

2019-07-27 04:34发布

问题:

Hi I am trying to display some marker points on a Google map v2. All is good until I found this bug. For some reason if I load the map with 2 pointers on it and then close it and reload it again I get this message:

"IllegalStateException no included points"

This error appears when I call the:

 LatLngBounds bounds = builder.build();

This is how I put the points on the map:

    // Point the map's listeners at the listeners implemented by the cluster
    // manager.

    googleMap.setOnMarkerClickListener(mClusterManager);

    builder = new LatLngBounds.Builder();

    for (Ad ad : Constants._results)
    {
        builder.include(new LatLng(ad.getLat(), ad.getLon()));
    }

    googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
        @Override
        public void onCameraChange(CameraPosition cameraPosition)
        {
            int padding = 50; // offset from edges of the map in pixels
            try{
                LatLngBounds bounds = builder.build();
                CameraUpdate cu = CameraUpdateFactory.newLatLngBounds(bounds, padding);
                googleMap.moveCamera(cu);
                googleMap.setOnCameraChangeListener(mClusterManager);
            }catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    });

Can anyone help out?

LogCat:

-30 14:11:11.267  20651-20874/com.myapp.user E/com.newrelic.agent.android﹕ Error in fireOnHarvestFinalize
java.util.ConcurrentModificationException
        at java.util.HashMap$HashIterator.nextEntry(HashMap.java:806)
        at java.util.HashMap$EntryIterator.next(HashMap.java:843)
        at java.util.HashMap$EntryIterator.next(HashMap.java:841)
        at com.newrelic.agent.android.metric.MetricStore.getAllByScope(MetricStore.java:63)
        at com.newrelic.agent.android.metric.MetricStore.getAllUnscoped(MetricStore.java:74)
        at com.newrelic.agent.android.harvest.HarvestDataValidator.ensureActivityNameMetricsExist(HarvestDataValidator.java:41)
        at com.newrelic.agent.android.harvest.HarvestDataValidator.onHarvestFinalize(HarvestDataValidator.java:15)
        at com.newrelic.agent.android.harvest.Harvester.fireOnHarvestFinalize(Harvester.java:580)
        at com.newrelic.agent.android.harvest.Harvester.execute(Harvester.java:271)
        at com.newrelic.agent.android.harvest.HarvestTimer.tick(HarvestTimer.java:73)
        at com.newrelic.agent.android.harvest.HarvestTimer.tickIfReady(HarvestTimer.java:56)
        at com.newrelic.agent.android.harvest.HarvestTimer.run(HarvestTimer.java:32)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:279)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:152)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:841)

回答1:

I think your problem lies here

 for (Ad ad : Constants._results)
    {
        builder.include(new LatLng(ad.getLat(), ad.getLon()));
    }

Constants._results must be empty, so there are no LatLng points in your builder. Debug and check.



回答2:

In the API, we find that :

public LatLngBounds (LatLng southwest, LatLng northeast): IllegalArgumentException if the latitude of the northeast corner is below the latitude of the southwest corner.

In your code, the exception is launched when the list to compute the bounds is empty:

LatLngBounds.Builder builder = LatLngBounds.builder();
for(ModelLatLngDisplay p: yourList)
{
    builder = builder.include(p.latLng);
}
return builder.build();


回答3:

Run marker task on UI thread.

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        //Add your marker here...
    }
});