2011-10-28 29 views
1

特定のポイントでマップにオーバーレイを配置する必要があります。APIからポイント座標を取得します。私はasynctaskでフェッチを行います。私は、オーバーレイを置くことに成功しました。地図をズームするか、それをスパンすると、応答は非常に遅くなります。 は、ここでのMapViewが処理できるオーバーレイアイテムの数には制限があり、私のoverlayitemクラスと私のasynctaskAndroid ItemizedOverlay <OverlayItem>

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); 
     } 
} 
+0

MapViewにいくつのマーカーを追加していますか? – Reno

+0

少なくとも30、それはApiが私に返すGeoPointの数に依存します。 – mauriyouth

+0

私は、MapViewが約100項目を処理できることを確認しました。これはマーカー画像と使用されたデバイスによって異なります。あまりにも多くのアイテムが追加された場合は、この緩慢な動作が表示されます – Reno

答えて

3

です。この制限には正式な言葉はありませんが、しばらくするとズーム/パン時の動作が鈍くなります。

いくつかの解決策は以下のとおりです。表示されている

  • LazyLoading of MapView
  • ロードのみなど、多くのマーカー、ズームレベルおよびスパンに基づいてこれを行います。
  • 99のポイントを持つ10のオーバーレイは、990のポイントを持つ1つのオーバーレイよりも速くなります。
+0

** mapview-overlay-manager **は、最新のコミット日から2010年9月28日に遡って古いですか?あなたが知っている最新の代替品はありますか?遅延読み込みはSDKに統合されていますか? – JJD

+0

@JJD SDKに組み込まれているmapviewで遅延読み込みが見つかりませんでした。あなたは2010年の実装に何かが欠けていると感じますか? – Reno

関連する問題