2012-11-28 3 views
0

세부 응용 앱이 시작되는 백그라운드 서비스를 실행하고있는사용자 추적 및 안드로이드

에서 백그라운드 서비스에 전송 데이터입니다. 이 서비스에서는 onStartCommand()에 GPS 위치 정보 수신을 시작합니다. 예를 들어 50 미터라고합시다. 위치는 다음과 같은 작업을 읽을 때마다 발생합니다

  • 읽기 위치는
  • 위치 (들)을 웹 서버로 전송되는 데이터베이스에서 모든 보내지 않은 위치를 검색 로컬 데이터베이스에 저장됩니다
  • 전송이 성공하면
  • 는, 위치 (들) 데이터베이스 이제이 문제는 위치가 read.The 사용자가 또는 50m를 만들기 위해 약간의 시간이 소요 도보있을 때마다 발생

에서 삭제됩니다 많은 읽기가 완료 될 수 있으며 데이터베이스 삽입/검색에서 문제가 발생할 수 있습니다. 따라서 주요 요청 중 하나는 모든 읽기 위치가 순차적으로 처리되도록하는 것입니다. 뭔가를 좋아하십시오 : 위치 1을 읽고, 그것을 삽입하고, 보내십시오 ... 위치 2를 읽고, 그것을 삽입하고, 보내십시오.

이 작업을 수행하는 적절한 방법을 찾을 수 없습니다. 아시다시피 서비스는 앱과 동일한 주 스레드에서 실행되므로 UI를 원활하게 유지하려면 스레딩을 사용해야합니다.

위치를 읽을 때마다 새 스레드를 제출할 ExecutorService와 Executors.newSingleThreadExecutor()를 사용하려고 생각했습니다. 이런 식으로, 나는 처리가 순차적으로 행해지는 것을 확인한다. 그러나 나는 각 읽기에 대해 새로운 쓰레드를 만든다. 그것은 좋은 일이 아닐 수도있다.

이 상황에 가장 적합한 접근 방법은 무엇입니까?

+0

그렇다면 ExecutorService 및 Executors.newSingleThreadExecutor() ....를 사용하거나 asynctasks의 모든 내용을 바꿈 – petey

답변

1

서비스를 제거하고 위치를 읽을 때마다 IntentService을 던집니다.

보류중인 인 텐트 인수와 함께 requestLocationUpdates을 사용할 수 있으며 인 텐트 서비스를 트리거하는 인 텐트로 보류중인 인 텐트 인수를 설정할 수 있습니다.

intentservice의 onHandleIntent에서 위치 업데이트를 처리 할 수 ​​있습니다. 인 텐트는 인 텐트 서비스에 의해 순차적으로 처리되며 별도의 스레드에서 처리됩니다 (만료됩니다).

백그라운드에서 한 번의 이벤트 만 사용하면 intentservice는보다 간단하고 적합한 솔루션입니다.

+0

배경 서비스를 사용하여 지속적으로 위치를 추적해야합니다. 그러나 당신의 생각은 재미있을 것 같습니다. 그럼 내가 물건을 streight 얻을 보자 : 내 서비스에서 위치를 읽을 때마다, 내가해야 할 일은 의도 서비스를 시작하고 그것에 읽기 위치를 전달하는 것입니다. 이 의도 서비스는 onHandleIntent에 현재 작업을 작업 대기열에 추가합니다. 따라서 위치를 읽을 때마다 위치 처리가이 작업 대기열에 추가됩니다. 첫 번째 위치가 처리 된 후 인 텐트 서비스가 종료되지 않습니까? – Alin

+0

훨씬 간단합니다. 보류중인 인 텐트를 인 텐트 서비스를 트리거하는 인 텐트와 함께 설정하면 인 텐트 서비스가 무료로 트리거됩니다. 이 유형의 모든 인 텐트는 대기열에 넣어지고 별도의 스레드에서 인 텐트 서비스에 의해 처리됩니다. onHandleIntent가 리턴되면 인 텐트 서비스가 종료됩니다.걱정할 필요가있는 것은 비즈니스 로직뿐입니다. – fedepaol

+0

public void requestLocationUpdates (long minTime, float minDistance, Criteria criteria, PendingIntent intent) (펜딩 가능한 argumetn이있는 것) – fedepaol