2017-05-03 1 views
2

BLE (Bleetooth)를 통해 빠른 데이터를 수신하는 Android 앱이 있습니다. 데이터는 원격 센서 장치에서 Android 스마트 폰의 전용 서비스 (Nordic nRF BLE 관리자)로 50-100Hz에 도달합니다. 데이터를 최고 속도로 개별 서비스에 전달하여 분석을 계산하고자합니다. 분석을 위해 IntentService를 사용하면 10 밀리 초마다 의도를 알 수 있습니다. 각 인 텐트에 상당한 오버 헤드가있을 것으로 확신하며,이 많은 데이터를 위해 설계된 것입니다. 그러나 내가 읽은 모든 것은 이것이 가장 간단한 해결책이라는 것을 암시합니다. 이것이 올바른 접근 방법입니까? 감사.Android : 빠른 데이터 용 IntentService 사용

+0

센서 데이터는 원격 장치에서 가져온 것이고 안드로이드 전화의 센서에서 가져온 것이 아닙니다. 그걸 정리하고 싶었을 뿐이야. – Hephaestus

답변

1

우선 실시간 동작이 필요한지 여부를 결정해야합니다. 데이터가 BLE를 통해 실시간으로 수신되고 있지만 실제로 실시간으로 처리해야합니까? 컴퓨팅중인 분석 기능이 실시간으로 필요하지 않은 경우 데이터를 수신하여 저장하고 나중에 처리하는 것이 좋습니다.

실시간 데이터 처리가 실제로 필요한 경우 IntentService은 적절한 디자인 선택이 아닙니다.

실시간 데이터 처리가 필요하지 않은 경우 IntentService이 작동하지만 성능 측면에서는 최적이 아닙니다.

두 개의 오버 헤드가 있습니다.

당신이 혼자서 찾은 첫 번째 - OS가 서비스에 의도를 "라우트"해야하기 때문에 보내는 의도는 약간의 추가 오버 헤드가 있습니다.

두 번째 것은 IntentService의 시작 및 중지와 관련됩니다. 의도 도착 사이의 시간 간격이 onHandleIntent()이 돌아 오는 데 걸리는 시간보다 낮 으면 시스템이 각 인 텐트에 대해 IntentService을 시작하고 중지합니다. 이 오버 헤드는 첫 번째 오버 헤드보다 훨씬 높습니다.

따라서이 경우에도 IntentService이 작동 할 수 있지만이 방법을 사용하면 안됩니다.

이 문제의 가장 좋은 해결책은 바운드 Service을 사용하는 것입니다. BLE 수신기에서 바인딩하고 일반 메서드 호출을 사용하여 데이터를 보냅니다. 단점은 자신이 두 가지 기능을 구현해야한다는 것입니다 : 백그라운드 스레드

이 쓰기에 처리를 오프로드

  • 논리를 처리해야하는 데이터 큐를 차단

    1. 논리는 간단하지 않지만 응용 프로그램이 심각한 프로젝트라면 IMHO를 수행하는 것이 옳은 일입니다. 소스 코드 IntentService에서 스레딩 논리를 복사하여 붙여 넣을 수 있습니다.

      한 단어의주의 : : 과도한 메모리 소비에 유의해야합니다. 예 : 처리를 위해 단일 백그라운드 스레드를 사용하고 들어오는 데이터의 비율이 처리 속도보다 높으면 대기열이 계속 증가합니다.이러한 상황에서 충분한 시간이 주어지면 OutOfMemory 예외로 인해 응용 프로그램이 중단됩니다 (IntentService에서도 발생할 수 있음).

      이 경우, 당신이 중 하나를 수행해야합니다 :

      1. 를 사용하여 여러
      2. 데이터 저장 SQLite는에 배경 처리를위한 스레드 (하지만 SQLite는 과도하게 성장할 수)
      3. 드롭 일부 데이터를
  • +2

    HandlerThread가 있습니다.이 큐에는 Looper에 메시지 큐가 있고 백그라운드에서 모든 작업을 수행합니다. –

    +0

    좋은 답변입니다. 바운드 서비스를 사용할 생각 이었지만 큐잉 문제는 고려하지 않았습니다. 작품은 실시간이 아닙니다. 샘플은 빠르지 만 분석은 2 초 정도 계산됩니다. 그러나, 나는 낙하 견본을 기울인다. – Hephaestus

    +0

    이 점에 대해 생각할 때, 요점은 (오버 헤드가 거의없는) 가능한 빨리 데이터를 버퍼에 쓴 다음 분석을 별도의 스레드로 포크하여 주 UI 스레드가 백업 및 드롭하지 않도록 보장하는 것입니다 견본. – Hephaestus

    1

    IntentService는 들어오는 인 텐트의 큐를 포함하므로 도착한 것보다 느린 인 텐트를 처리하면 할 수 있습니다. 그러나 HandlerThread를 사용하여 Message 내에 들어오는 데이터를 게시 할 수 있습니다. 임베디드 메시지 큐도 있지만 IntentService 생성과 마찬가지로 오버 헤드가 없습니다. 또 다른 접근법 - 일반 서비스를 사용하고 RxJava 라이브러리로 배압을 처리합니다.

    +0

    LocalBinder를 사용하여 바운드 서비스를 사용할 수도 있습니다. 이렇게하면 BLE Service가 Analytics Service에 직접 호출하여 데이터를 배치 할 수 있습니다. HandlerThread도 살펴볼 것입니다. – Hephaestus

    관련 문제