Android ItemizedOverlay <OverlayItem> пытанне

я павінен паставіць некаторыя пазнакі на карце на канкрэтнай кропцы, я выбарка пункту каардынатаў з API. я рабіць выбарку ў AsyncTask. я здолеў паставіць пазнакі, пакласці, калі я сапраўды маштаб малюнка на карце або ахопліваць праз яго, рэакцыя ідзе вельмі марудна. вось мой overlayitem клас і мой AsyncTask

public class Marker extends ItemizedOverlay {
    private Context con;

    private ArrayList mOverlays = new ArrayList();


    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 {

        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 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
Колькі маркераў Вы дадаеце да MapView?
дададзена аўтар Reno, крыніца
Я бачу, што MapView можа апрацоўваць каля 100 пунктаў, гэта залежыць ад маркерных малюнкаў і прылада, якое выкарыстоўваецца. Пры даданні занадта шмат элементаў, вы будзеце бачыць гэта млявае паводзіны
дададзена аўтар Reno, крыніца
па меншай меры 30, гэта залежыць ад таго, колькі GeoPoint API-інтэрфейс вярнуць мяне.
дададзена аўтар mauriyouth, крыніца
ў вас ёсць якія-небудзь спасылкі на якія, маркерная малюнка памеру?, для прылады ім яшчэ на віртуальным.
дададзена аўтар mauriyouth, крыніца
дзякуючы MapView не можа апрацоўваць шмат рэчаў адначасова
дададзена аўтар mauriyouth, крыніца

1 адказы

Існуе абмежаванне на колькасць накладзеных элементаў, якія MapView можа апрацоўваць. Там няма ніякага афіцыйнага словы пра тое, што гэты мяжы, але праз некаторы час, вы ўбачыце млявае паводзіны падчас павелічэння/патэльняў.

Некаторыя рашэнні з'яўляюцца:

  • LazyLoading з MapView
  • Загрузіце толькі як многія маркеры, якія бачныя, робяць гэта на аснове ўзроўню маштабавання і дыяпазон.
  • 10 накладанняў з 99 кропкамі хутчэй, чым 1 накладка з 990 кропкамі.
3
дададзена
Ці з'яўляецца MapView-оверлэй-менеджэр састарэць, паколькі апошні комм ўзыходзіць да 28 вер 2010? Ці ёсць удакладненыя альтэрнатывы вы ведаеце прэч? Інтэгруецца адкладзенай загрузкі ў SDK?
дададзена аўтар JJD, крыніца
@JJD я не мог знайсці любую адкладзеную загрузку ў MapView інтэграванага ў SDK. Ці лічыце вы, што рэалізацыя 2010 хапае чагосьці?
дададзена аўтар Reno, крыніца