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、それはApiが私に返すGeoPointの数に依存します。
追加された 著者 mauriyouth,
あなたはそれにマーカー・イメージ・サイズのリンクを持っていますか?
追加された 著者 mauriyouth,
おかげでmapviewは同時に多くの項目を扱うことができません
追加された 著者 mauriyouth,

1 答え

MapViewで処理できるオーバーレイアイテムの数には制限があります。この制限には正式な言葉はありませんが、しばらくするとズーム/パン時の動作が鈍くなります。

いくつかのソリューションは次のとおりです。

  • MapViewのレイジーロード
  • 表示されている数だけマーカーを読み込み、ズームレベルとスパンに基づいて行います。
  • 99ポイントの10オーバーレイは990ポイントの1オーバーレイよりも高速です。
3
追加された
最新のコミットが2010年9月28日に遡ってから mapview-overlay-manager が時代遅れになっていますか?あなたが知っている最新の代替品はありますか?遅延読み込みはSDKに統合されていますか?
追加された 著者 JJD,
@JJD SDKに統合されたmapviewで遅延ロードを見つけることができませんでした。あなたは2010年の実装に何かが欠けていると感じますか?
追加された 著者 Reno,