2012-02-23 61 views
0

好吧,讓我解釋我在做什麼,然後我有幾個問題。服務結構,HttpClient的使用和ANR

Explination

我有一個應用程序我的工作將使用一個服務來檢查我的網頁更新每隔1-10分鐘。因此,在ACTION_BOOT_COMPLETED上,MyReceiver(廣播接收器)被觸發,如果它是ACTION_BOOT_COMPLETED廣播,它將啓動一個名爲BootService的服務。 BootService然後設置觸發MyReceiver的AlarmService,然後終止BootService。當警報廣播進入MyReceiver時,它會觸發另一個名爲UpdateService的服務,它將以BootService設置的任何間隔檢查互聯網。

我有一個名爲BootService的服務,因爲每次啓動我的應用程序時,它都會啓動BootService以確保AlarmService正在運行,以防因任何原因終止。

當我提出HTTPClient請求時,我希望它被登錄保護,所以我試圖做的是無論何時運行BootService,它都會向我的網站發起HTTPClient請求,登錄並存儲會話ID,在UpdateService中使用。但是,當我將HTTPClient請求放入BootService時,我得到一個ANR(應用程序無響應)。我嘗試把HTTPClient請求放入一個AsyncTask中,但仍然遇到問題。

問題

  1. 它會更好,如果我廢除了BootService,而是隻需要MyReceiver設置AlarmService。每當有人加載應用程序剛發出廣播發起警報,又是什麼?

  2. 什麼可能導致HTTPClient請求期間阻塞了我的程序並強制ANR?我怎樣才能正確實現我的HTTPClient請求,所以它不會阻止我的服務?

  3. 任何一個很好的登錄/ cookie存儲方法的例子。並且稍後使用會話ID來提出未來請求的服務?

回答

0

當我做我的了HTTPClient請求我希望它可以登錄保護,所以我試圖做的是每當運行BootService,它會發起了HTTPClient要求到我的網站,登錄和存儲會話我將在UpdateService中使用的id。

除非Web服務允許無限的會話持續時間,否則這項工作可能會非常棘手。我建議你在每次更新時都進行登錄。

但是,當我把HTTPClient請求放入BootService時,我得到一個ANR(應用程序沒有響應)。

這意味着你試圖做太多的工作onStartCommand(),或onCreate(),或onDestroy()onBind()。所有這些方法都在主應用程序線程中調用,因此您無法在此處進行重要的工作。

如果我廢除了BootService而只是讓MyReceiver設置了AlarmService,會更好嗎?

是的。

什麼可能導致HTTPClient請求期間的所有暫緩,它鎖定我的程序並強制ANR?

網絡I/O速度可能會變慢。

如何正確實現我的HTTPClient請求,使其不會阻塞我的服務?

使用IntentService並在onHandleIntent()中執行您的網絡I/O。

+0

我現在就試試這個。請等候。 – Rawr 2012-02-24 21:55:30

+0

我之前遇到了一些問題,IntentService並不總是被調用......不知道是怎麼回事,但在測試期間,我每隔15秒就發出一次HTTPClient請求,所以我只是將它歸因於異步隊列。這意味着其中一個請求沒有通過,並且在繼續執行我稱爲的其他IntentServices之前,它正在等待該請求完成。我會在HTTPClient上設置一個超時時間,所以它不會浪費超過10秒鐘,而且我也將時間間隔增加到一分鐘,因爲我知道我可以可靠地輪詢互聯網。再次感謝! – Rawr 2012-02-25 01:20:59