2012-03-05 5 views
1

저는 주로 자전거 타기 용으로 gps-tracker를 만들려고합니다. 적어도 개인적인 용도로 사용할 수있는 앱을 만들었지 만이를 개선하고 ContentProviders, Fragments, CursorAdapters 및 서비스를 추가하여 GPS에서 onLocationChanges를 수신했습니다.gps-location을 sqlite에 계속 저장하십시오.

그러나 실제로받는 위치 스트림을 처리하는 방법을 알지 못합니다. 내 오래된 앱에서 그냥 ArrayList에 저장 했으므로 이제 내 서비스에서 내 Activity로 브로드 캐스트를 보내 ArrayList에 저장합니다.

문제는 드라이브가 끝나면 위치를 sqlite에 저장하는 데 5-15 초가 소요된다는 것입니다 (예, 저는 compiledstatement와 트랜잭션을 사용하고 있습니다). 수신 된 위치. 내가 그렇게하려고 할 때 UI 스레드에서 삽입 작업을 수행 할 때 내 앱이 응답하지 않게되었습니다 (예상대로). 위치 업데이트를 자주 수신합니다.

이것은 물론 앱의 가장 중요한 측면이므로 해결책은 무엇입니까?

  • 스레드에서 삽입 작업을 수행 할 수 있지만 단일 레코드를 삽입하는 것이 비용이 많이 들기 때문에 계속 유지할 수 있을지 확신하지 못합니다.

  • 트랜잭션에서 한 번에 25 개의 레코드 (또는 그 이상)를 쓸 수 있지만 저장되는 항목과 저장되지 않은 항목을 추적하는 논리가 있습니다.

더 나은 사용자 경험을위한 다른 옵션이 있습니까?

답변

0

Personaly 나는 gps 트랙이 데이터베이스 트랙에 내장 된 것보다 파일에서 더 좋을 것이라고 생각한다. 그것은 데이터베이스에서 embeding이 권장 솔루션이 아닌 그림과 같은 senario입니다. 데이터베이스는 일부 요약 정보와 파일에 대한 참조를 보유합니다. 너는 갈 때 파일을 써서 마지막에 큰 멈추지 않게해라. 맵이나 그래픽 플롯 등에서 경로를 표시하는 데 레코딩하는 동안 레코딩하는 동안 로컬 ArrayList도 유지합니다. 이것이 내가 자전거 앱 IpBike에서하는 일입니다.

+0

감사합니다. 그것은 고려해야 할 사항 일 수 있습니다. 데이터베이스 대신 파일에 쓰는 것이 더 빠를 것이라고 가정합니다. 녹음하는 동안 파일을 열어 두었습니까? –

+0

예 서비스에 파일을 쓰고 그냥 열어 두십시오. 나는 간헐적으로 그것을 내 보낸다. – Ifor

3

IntentService를 사용하여 저장을 다른 스레드에 위임 한 다음 applyBatch를 사용하여 삽입합니다.

+0

하지만 그렇게하면 5-15 초 (또는 더 긴 여행에서 더 이상) 동안 데이터를 사용할 수 없으므로 피하려고합니다. –