공부를 위해 포스팅 된 글이므로, 부정확한 정보를 포함하고 있음을 감안하고 읽어주시기 바랍니다.

 

오늘은 구글 맵에서 기본적으로 제공되는 UI 버튼들을 커스텀 해서 사용하고, 활성화, 비활성화 

하는 작업을 했다.

 

https://developers.google.com/maps/documentation/android-sdk/controls 

 

Controls and Gestures  |  Maps SDK for Android  |  Google Developers

Using the Maps SDK for Android, you can customize the way in which users can interact with your map, by determining which of the built in UI components appear on the map and which gestures are allowed. Code samples The ApiDemos repository on GitHub include

developers.google.com

기본적으로 GoogleMap 객체에서 GetUISettings() 를 호출해서 버튼들을 얻어 올 수 있으나,

위치를 설정하기가 너무 불편해서 직접 레이아웃에 버튼을 생성하여 이벤트를 걸어줬다.

 

btn_myLocation.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mGoogleMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(mCurrentLocatiion.getLatitude(),mCurrentLocatiion.getLongitude())));
            }});
        btn_zoomIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { mGoogleMap.animateCamera(CameraUpdateFactory.zoomIn());}});
        btn_zoomOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { mGoogleMap.animateCamera(CameraUpdateFactory.zoomOut()); }});

 

    @Override
    public void onLocationChanged(Location location) {

        currentPosition
                = new LatLng( location.getLatitude(), location.getLongitude());


//        Log.d(TAG, "onLocationChanged : ");

        String markerTitle = getCurrentAddress(currentPosition);
        String markerSnippet = "위도:" + location.getLatitude()
                + " 경도:" + location.getLongitude();

        //현재 위치에 마커 생성하고 이동
        setCurrentLocation(location, markerTitle, markerSnippet);

        mCurrentLocatiion = location;
    }

 

 

이 글은 공부를 위해 작성된 글이므로 정확한 정보가 아닐 수 있음을 감안하고 읽어주시기 바랍니다.

 

오늘은 DB에서 얻은 위치정보를 이용하여 마커를 생성하도록 하는 기능을 추가시키는 중이었는데,

문제가 발생했다....

 

onResponse에서 얻은 값을 이용하여 바로 마커를 생성하도록 했는데,

마커를 찍는것은 UI 스레드에서 실행되어야 하는것이다.

서버에서 데이터는 OKHttp를 이용하여 받았는데 OKHttp의 onResponse는 메인 스레드에서 실행되지 않으므로

문제가 발생한 것이었다.

 

public void onSuccess(@Nullable String data) {
        Log.d("onSuccess",data + "얻은 값");
        
        // DB에서 얻은 값 파싱하여

        for(int i = 0; i < mapDataItems.length; i++)
        {
            final MarkerOptions  marker = new MarkerOptions()
                    .position(new LatLng(mapDataItems[i].getPLACE_COORD_X(),mapDataItems[i].getPLACE_COORD_Y()))
                    .title(mapDataItems[i].getPLACE_TITLE())
                    .snippet(mapDataItems[i].getPLACE_ADDRESS())
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));
                    
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mGoogleMap.addMarker(marker);
                }
            });


            }

나같은 경우는 마커를 찍는 부분만 메인 스레드에서 실행되도록 했다.

 

 

간단하게 해결하긴 했으나 이렇게 작성하는 것이 맞는지는 모르겠다.

하지만 이 코드를 사용하여 나는 원하는 결과를 얻었다.

+ Recent posts