Android ItemizedOverlay<OverlayItem> issue

送分小仙女□ 提交于 2019-12-11 08:27:23

问题


i have to put some overlays on map on specific point, i fetch the point coordinate from an API. i do the fetching in a asynctask. i succeeded to put the overlays, put when i do zoom on the map or span through it, the response is very slow. here's my overlayitem class and my asynctask

public class Marker extends ItemizedOverlay<OverlayItem> {
    private Context con;

    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();


    public Marker(Drawable defaultMarker) {
        super(boundCenterBottom(defaultMarker));
        // TODO Auto-generated constructor stub
    }

    public Marker(Drawable defaultMarker, Context context) {
        super(boundCenterBottom(defaultMarker));
        con=context;
        // TODO Auto-generated constructor stub
    }

    @Override
    protected OverlayItem createItem(int i) {
        // TODO Auto-generated method stub
        return mOverlays.get(i);
    }

    @Override
    public int size() {
        // TODO Auto-generated method stub
        return mOverlays.size();
    }

    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }
}

...

private class TeleportdAPIParser extends AsyncTask<Void, Object, Void> {

        private final HttpTransport http= AndroidHttp.newCompatibleTransport();
        private HttpRequestFactory fact;
        private HttpRequest request; 
        private HttpResponse response; 
        private String urlString;
        private JsonFactory jsonFactory; 
        private JsonParser jp;
        MapView mapView;
        Marker marker;
        List<Overlay> mapOverlays;
        ImageAdapter adapter;



        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            mapView=(MapView) findViewById(R.id.mapView);
            Drawable drawable = getResources().getDrawable(R.drawable.puce);
            marker = new Marker(drawable);
            mapOverlays = mapView.getOverlays();
            adapter=new ImageAdapter();
            GridView gridview=(GridView) findViewById(R.id.gridView);


        }


        @Override
        protected  Void doInBackground(Void... params) {

            fact=http.createRequestFactory();
            jsonFactory = new JsonFactory();
            TPortItem tpi= new TPortItem();
            TPortItemList tpl=new TPortItemList();


                urlString="http://v1.api.teleportd.com:8080/search?apikey=1c5a31ccf46c54572e484e103c97239bd&loc=%5B48.87,2.34,5.0,5.0%5D";
                try {
                    //urlString=URLEncoder.encode(urlString,"UTF-8");
                    request = fact.buildGetRequest(new GenericUrl(urlString));
                    HttpHeaders header=new HttpHeaders();
                    header.setAcceptEncoding("gzip");
                    request.setHeaders(header);
                    response = request.execute();
                    jp = jsonFactory.createJsonParser(new BufferedInputStream(response.getContent()));


                    while(jp.nextValue()!=JsonToken.NOT_AVAILABLE){

                        jp.nextValue();
                        while(jp.getCurrentToken()!=JsonToken.END_OBJECT && jp.getCurrentToken()!=null){                            

                                if(jp.getCurrentName().equals("sha")){
                                    tpi.sha=jp.getText();
                                }

                                if(jp.getCurrentName().equals("date")){
                                    tpi.date=jp.getIntValue();          
                                }

                                if(jp.getCurrentName().equals("age")){
                                    tpi.age=jp.getIntValue();
                                }

                                if(jp.getCurrentName().equals("thumb")){
                                    tpi.thumb=jp.getText();
                                    if(adapter.URLS.size()<10)
                                        adapter.URLS.add(tpi.thumb);

                                }

                                if(jp.getCurrentName().equals("rank")){
                                    tpi.rank=jp.getIntValue();
                                }

                                if(jp.getCurrentName().equals("grade")){
                                    tpi.grade=jp.getIntValue();
                                }

                                if(jp.getCurrentName().equals("loc")){
                                    jp.nextValue().toString();
                                    tpi.loc[0]=(int) (jp.getFloatValue()*1E6);
                                    jp.nextValue().toString();
                                    tpi.loc[1]=(int) (jp.getFloatValue()*1E6);
                                    jp.nextValue();
                                    publishProgress(new GeoPoint (tpi.loc[0],tpi.loc[1]));

                                }

                                jp.nextValue(); 
                            }



                        //tpl.i.add(new TPortItem(tpi.sha, tpi.loc,tpi.age, tpi.date,tpi.thumb, tpi.rank, tpi.grade));


                    }   

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            return null;
        }

        @Override
        protected void onProgressUpdate(Object... values) {
            super.onProgressUpdate(values);
            marker.addOverlay(new OverlayItem((GeoPoint) values[0], "Hola, Mundo!", "I'm in Mexico City!"));
            mapOverlays.add(marker); // adding the whole overlays (list) on the maps


        }


        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            mapView.invalidate();
            //gridview.setAdapter(adapter);
        }
}

回答1:


There is a limit to the number of overlay items that MapView can handle. There is no official word on what this limit is, but after some while, you will see sluggish behaviour during zoom/pan.

Some solutions are :

  • LazyLoading of MapView
  • Load only as many markers that are visible, do this based on the zoom level and span.
  • 10 overlays with 99 points are faster than 1 overlay with 990 points.


来源:https://stackoverflow.com/questions/7927185/android-itemizedoverlayoverlayitem-issue

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!