2011-10-28 3 views
1

지도에서 오버레이를 특정 지점에 배치해야합니다. API에서 포인트 좌표를 가져옵니다. 나는 asynctask에서 페치를한다. 오버레이를 넣는 데 성공했습니다.지도를 확대하거나 스팬 할 때 넣으면 응답이 매우 느립니다. 여기지도보기가 처리 할 수있는 오버레이 항목의 수에 제한이 내 overlayitem 클래스와 내 AsyncTask를Android 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

2010 년 9 월 28 일까지 최신 커밋 날짜 이후 ** mapview-overlay-manager ** 구식이 오래 되었습니까? 당신이 알고있는 최신 대안이 있습니까? SDK에 지연로드가 통합되어 있습니까? – JJD

+0

@JJD SDK에 통합 된 mapview에서 지연로드를 찾을 수 없습니다. 2010 년 시행에 뭔가 부족한 점이 있습니까? – Reno

관련 문제