구글맵에 디비에서 가져온 좌표로 마커를 찍으려고 하는데요. 약 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문 횟수만큼 전부 찍히고 있습니다