2013-05-13 1 views
3

시나리오Google지도 API V2 addMarker 및 OnCameraChangeListener

  • 초기 사용자의 위치를 ​​읽어와 마커는 카메라 위치가 해당 위치로 설정 + 추가됩니다.
  • 사용자가 카메라를 드래그/줌할 때마다 웹 서비스를 호출하고지도의 직사각형 좌표를 전달해야합니다. 이 웹 서비스는지도의 범위 내에있는 마커로 표시 할 위치 목록을 반환합니다.

그래서 기본적으로 내가 좋아하는 일을하고있다 : 각 항목은 웹 서비스에서 반환을위한 작업 onPostExecute

에서 onCreate

mMap.setOnCameraChangeListener(new OnCameraChangeListener() { 
    @Override 
    public void onCameraChange(CameraPosition cameraPosition) { 
     // Make a web call for the locations 
     myTask = new MyTask(); 
     myTask.execute(); 
} 

를 걸 :

mMap.addMarker(
    new MarkerOptions().position(
     new LatLng(myPoint.getLatitude(), myPoint.getLongitude()) 
    ) 
    .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_pushpin)) 
); 

예상되는 동작 : : 사용자가 스크롤이나 줌, 카메라 위치 변경 및 비동기 작업이 활성화 좌표

의 신선한 배치를 얻기 위해 다시 호출 될 때마다

실제 행동 : onPostExecuteOnCameraChangeListener 사이의 무한 루프 .

내게는 어쩌면 내가 잘못한 것 같아서 addMarker이 카메라 변경 이벤트를 트리거합니까? 위에서 설명한 예상되는 동작을 어떻게 만들 수 있습니까?

답변

4

내게는 어쩌면 내가 잘못한 것 같은데, addMarker가 카메라 변경 이벤트를 트리거합니까?

아니요. 이 퍼즐을 풀기 위해 다른 사람에게 전체 코드를 추가 할 수 있습니다.

예상되는 동작 : 사용자가 스크롤이나 줌, 카메라 위치 변경 및 비동기 작업이 당신이 가져 싶은 이유는 활성 좌표

을의 새로운 배치를 얻기 위해 다시 호출 될 때마다 사용자가 카메라 위치를 변경할 때마다 동일한 데이터가 필요합니까? 한 번만 모든 데이터를 가져 오기 및 SQLite는 DB로 저장

  • :

    일부 고려 사항은 사용자 경험을 향상시킬 수 있습니다. 물론 데이터가 변경되면 동기화해야하며 아마도 웹 서비스 변경이 필요할 것입니다. 간단한 사용자 인터페이스 변경으로 모든 것을 다운로드하지 마십시오.

  • 외부 웹 서비스 통신을 메모리 부족 솔루션을위한 컨텍스트로 유지하십시오. MyTask을 내부 클래스 Activity 안에 넣으면 작업이 완료 될 때까지 메모리에 Activity이 계속 파괴됩니다.
  • 표시 영역에 마커를 추가하고 이미 추가 된 경우에만 마커를 제거하지 않습니다. 마커의 수는 계속 증가하지만 사용자가지도를 이동할 때마다 clear()에 전화하는 것보다 낫습니다. CommonsWare는 정확하게 다음과 같이 제안합니다. IPC가 적어집니다. 이를 위해 Android Maps Extensions을 제안 할 수 있습니다. 마커 클러스터링을 사용하지 않더라도 마커를 동적으로 추가 할 수 있으므로 직접 작성하지 않아도됩니다.
+0

addMarker가 카메라 업데이트를 트리거하지 않는다는 사실을 확인해 주셔서 감사합니다. 나는 내 코드를 조금 더보고 문제를 보았다. (나쁜 활동은 재시작했다.) 마커가있는 것은 그들이 대부분의 시간에 역동적이어서 모든 것을 다시 읽는 것이다. – Alin

+0

@Alin 대부분의 시간은 얼마나 자주합니까? 마커는 사람을 나타 냅니까? 'onCameraChange'를 사용하여 트리거하는 것은 여전히 ​​좋지 않습니다. 사용자는 더 오랜 시간 동안 상호 작용할 필요가 없으며 미친 것처럼 스 와이프하여 남극 대륙에 어떤 마커가 있는지 확인할 수 있습니다. X 분/시간/일 단위로 데이터 업데이트를받는 것이 훨씬 좋습니다. 물론 폴링은 결코 밀어 붙이지 않을 것입니다. –

+0

프로젝트 사양은 다음과 같습니다. 사용자가 30 초 간격으로 스 와이프/줌할 때마다 마커를 가져옵니다. 마커는 자동차입니다. 문제는 웹 서비스는 가시적 인 좌표에 대해서만 데이터를 반환하기 때문에 조금 끄고 드래그하면 나머지 마커를 업데이트하고 새로운 마커를 표시해야합니다. 보시다시피, 매번 호출되는 웹 서비스를 얻는 것이 유일한 방법 일 것입니다. 마커는 내가 믿는 약 10-15이다. 이 앱은 매우 구체적이어서 특정 도시에서만 사용되므로 사용자가 너무 크게 축소/스 와이프 할 필요가 없습니다. – Alin

1

위에서 설명한 예상 동작을 어떻게 만들 수 있습니까?

데이터가 이전 작업과 다른 경우에만 먼저 MyTask을 호출하십시오. 실제 카메라 변경이 없으면 좌표는 마지막 작업과 동일해야하며 서버를 다시 칠 필요가 없습니다.

둘째, 아직지도에 표시되지 않은 마커 만 추가합니다 (이미 삭제 된 마커는 삭제하지 않음). 이전 단계에서 다루지 않은 미세한 카메라 변경 사항이 있더라도 이러한 변경으로 인해 마커의 구성이 변경되지는 않습니다. 나는 현재의 논리가 모든 마커를 날려 버리고 다시 불러올 것이라고 생각합니다.이 카메라 변경 동작에 관계없이 특히 효율적이지는 않습니다. GoogleMap에 대한 전화는 IPC와 관련이 있으므로 가능한 한 많이 갖고 싶습니다.