2011-10-28 30 views
1

我必须在特定点的地图上放置一些覆盖图,我从API获取点坐标。我在asynctask中抓取。我成功地放置了叠加层,当放大地图或跨越地图时,响应非常缓慢。 这里是我的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,这取决于有多少GeoPoint API返回给我。 – mauriyouth

+0

我已经看到MapView可以处理大约100个项目,这取决于标记图像和使用的设备。如果添加的项目太多,您会看到这种缓慢的行为 – Reno

回答

3

还有就是那MapView类可以处理重叠的项目的数量限制。关于这个限制是什么没有官方的说法,但过了一段时间后,你会看到在缩放/平移过程中呆滞的行为。

一些解决方案是:

  • LazyLoading of MapView
  • 只能装入尽可能多的标志是可见的,这样做基于缩放水平和跨度。
  • 具有99个点的10个覆盖图比具有990个点的1个覆盖图更快。
+0

自从最新的提交日期为2010年9月28日以来,** mapview-overlay-manager **是否已过时?有没有你知道的最新替代品?是否在SDK中集成了延迟加载? – JJD

+0

@JJD我在SDK中集成的mapview中找不到任何延迟加载。你觉得2010年的实施缺乏什么? – Reno

相关问题