마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 구글맵 마커관련 질문좀 드리겠습니다.

0 추천

구글맵에 디비에서 가져온 좌표로 마커를 찍으려고 하는데요. 약 200여개정도 되구요

원래 구글맵 사용하는 프래그먼트클래스에서 반복문으로 200번돌려서 마커를 생성해서 하나씩 addMarker했었는데
이렇게하면 200여개 마커가 전부다 찍히긴하는데 구글맵로딩시간이 좀 지연되고 확대/축소나 드래그해서 맵이동시에
약간 버벅대는 느낌이 심하게 있어서.. 구글링해보니 쓰레드를 이용하라고 하더라구요 그래서 코드를 바꿔보았는데
맵에 마커가 전부다 찍혀야하는데 맨마지막꺼 하나만 찍히네요.. 문법상 오류는 없습니다. 왜이런걸까요ㅜㅜ
 
구글맵 사용하는 클래스에서 쓰레드생성과 스타트
private void addMarkers() {
  mShopList = mControler.selectAllShop();
  new MarkersThread(mShopList, mMap).start();
}

 

 
쓰레드소스
public class MarkersThread extends Thread {

   private ArrayList<MyShopItem> mShopList = new ArrayList<MyShopItem>();
   private Handler mAfterCreateMarker;

  public MarkersThread(ArrayList<MyShopItem> shopList, GoogleMap map) {
      mShopList = shopList;
      mAfterCreateMarker = new Handler(new MarkersHandler(map));
}

@Override
public void run() {
   MarkerOptions marker = new MarkerOptions();

   for (int i = 0; i < mShopList.size(); i++) {
        marker.position(new LatLng(mShopList.get(i).getLat(), mShopList.get(i).getLng()));
        marker.title(mShopList.get(i).getShopName());
        marker.snippet(mShopList.get(i).getShopAddr());
        marker.draggable(true);
        marker.icon(BitmapDescriptorFactory.fromResource(R.drawable.marker));

        Message msg = mAfterCreateMarker.obtainMessage();
        msg.obj = marker;

        mAfterCreateMarker.sendMessage(msg);
        Log.d("marker", " "+i);
}
}
}

class MarkersHandler implements Handler.Callback{
      private GoogleMap mMap;

      public MarkersHandler(GoogleMap map) {
          mMap = map;
      }

@Override
public boolean handleMessage(Message msg) {
       MarkerOptions marker = (MarkerOptions) msg.obj;
       Log.d("msg", "aaaaa");
       if(marker != null){
          mMap.addMarker(marker);
        }
      return true;
}
}

 

 
이렇게 했습니다. run메서드에서 로그 찍어보니 for문은 전부다 돌고있구요
handleMessage메서드에서 찍은 로그도 for문 횟수만큼 전부 찍히고 있습니다
미카라 (120 포인트) 님이 2015년 3월 9일 질문

2개의 답변

0 추천
200 개를 다 찍지 마시고 근접하고 있는 놈들을 묶어서 처리 하고 확대하면 화면내에 놈들만  다시 찍는 식으로 하세요
aucd29 (218,390 포인트) 님이 2015년 3월 9일 답변
0 추천
MarkerOptions marker = new MarkerOptions();

을 for문안으로 옮기셔야 할듯
nicehee (73,100 포인트) 님이 2015년 3월 9일 답변
...