2012-11-28 98 views
0

詳細用戶跟蹤和數據在Android中

應用程序有當應用程序啓動一個後臺服務運行在後臺服務發送。在這項服務中,onStartCommand()開始使用讀取之間傳遞的參數的參數來偵聽GPS位置。比方說50米。每一個位置閱讀下面的操作時有發生:

  • 讀取位置存儲在本地數據庫
  • 從數據庫
  • 位置(一個或多個)發送到Web服務器檢索所有未發送的位置
  • 如果發送成功,位置(一個或多個)從數據庫

現在這種行爲發生的每一次位置read.The用戶可能行走這需要一些時間,使50米或刪除驅動速度很快,而許多讀取操作可能會完成,而且數據庫插入/檢索操作可能會變得麻煩。因此,其中一個主要要求就是在讀取它們時順序處理所有讀取位置。就像:讀取位置1,插入它,發送它...讀取位置2,插入它,發送它。

我找不到一個合適的方法來做到這一點。如您所知,該服務與應用程序在相同的主線程中運行,因此我肯定需要使用線程來保持UI運行平穩。

我想使用的ExecutorService和Executors.newSingleThreadExecutor()到每一個位置的讀取時間提交新的線程。通過這種方式,我確保處理是按順序完成的,但是......我爲每次讀取創建新線程,這可能不是什麼好事。

對於這種情況,你會建議什麼最好的方法?

+0

是的,使用ExecutorService&Executors.newSingleThreadExecutor()....或者將所有東西包裝在async服務器中 – petey

回答

1

我會做的就是刪除該服務並拋出IntentService每一個位置讀取時間。

您可以使用requestLocationUpdates意圖的說法之前,並與觸發你的意圖服務的意圖的待定意圖的說法。

在intentservice的onHandleIntent然後,您可以處理位置更新。意圖由intent服務按順序處理,並在單獨的線程中處理它們(然後到期)。

如果你只需要消耗的背景一次性事件,intentservice是更緊湊,更適合的解決方案。

+0

我確實需要使用後臺服務來持續跟蹤位置。但是,你的想法聽起來很有趣。所以,讓我看看是否讓事情變得更加直觀:在我的服務中,每次讀取位置時,我所需要做的就是啓動意向服務並將讀取位置傳遞給它。這個意圖服務在'onHandleIntent'中將當前作業添加到工作隊列中。因此,每次讀取位置時,都會在此工作隊列中添加位置處理。第一個地點處理後,意向服務不會關閉嗎? – Alin

+0

這簡單得多。如果您使用意圖觸發您的intentservice設置了掛起的意圖,則您的intentservice將被免費觸發。這種類型的每個意圖都放入一個隊列中,並由意向服務在一個單獨的線程中處理。意圖服務在onHandleIntent返回時死亡。你需要擔心的只是業務邏輯。 – fedepaol

+0

您需要使用public void requestLocationUpdates(long minTime,float minDistance,Criteria criteria,PendingIntent intent)(具有pendingintent argumetn的那個) – fedepaol