2012-09-04 114 views
0

我有一個android應用程序,它包含向用戶顯示信息的主要活動。 當主要活動開始時,會創建一個服務,每10秒檢查一次Web服務 - 如果WS返回應答,則彈出通知。主要活動和服務之間沒有任何聯繫(除非我希望他們一起開始)。問題是活動工作非常緩慢 - 因爲服務正在運行。每10秒運行一次的Android服務

我該如何解決?我嘗試使用IntentService,但他在10秒後死亡。

我正在使用的代碼:

@Override 
public void onCreate() {  

super.onCreate(); 
context = this.getApplicationContext(); 
mPeriodicEventHandler = new Handler(); 
mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); 
} 

private Runnable doPeriodicTask = new Runnable() 
{ 
    public void run() 
    { 
     NotificationServices.Notification(); 
     mPeriodicEventHandler.postDelayed(doPeriodicTask, PERIODIC_EVENT_TIMEOUT); 
    } 
}; 
+0

10秒真的很快,如果連接真的很慢? – XepterX

+0

您是否在使用待定意圖從服務中進行通知? – Dheepak

+0

@XepterX - 這只是POC,因此它可以在我們的WiFi實驗室上運行。 – Shkolar

回答

0

處理程序正在執行任務的主UI線程,可能會影響您的活動的UI甚至導致ANR。

我會建議創建一個新的HandlerThread並在那裏發佈你的任務。

但是,確保你真的想每10秒拉一次數據。移動互聯網和設備功耗成本很高。

考慮使用Persistent ConnectionGoogle Cloud Messaging

+0

嘿, 這是POC - 所以我們想要說明GCM和輪詢。 我應該在服務中創建handlerThread嗎? – Shkolar

+0

是的。創建新的HandlerThread(「name」),調用start(),等待它真正開始(在start()之間有一個小延遲,它確實發生了),然後從這個線程獲取getLooper()。 完成之後 - 只需用new Handler(thread.getLooper())創建Handler就可以正常工作 – AlexN

0

使用處理程序,我們可以做到這一點

final Handler handler = new Handler(); 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       handler.postDelayed(r, 10000); 
      } 
     }; 
     handler.postDelayed(r, 0); 
0

參考前臺服務控制器例如API Demos和更新未決事件,只要web服務進行更新。

也考慮使用Asynctask

我希望這有助於:)