2012-01-27 48 views
4

什麼是最好的實現方法。我有一個Android應用程序,它將使用我的Python服務器在兩個電話之間進行通信。輪次意味着他們不能相互交談,直到一輪迴合開始,一旦他們發送消息,他們就不能發送另一個消息,直到對方作出迴應,然後開始新一輪。IntentService,Service或AsyncTask

我在想我會使用IntentService,但它似乎是錯誤的,讓服務器不斷啓動和停止,我不會不必擔心與asynctask的問題或者是處理它的最佳方式。我怎麼能有一個服務,應該接收和發送消息給客戶端,似乎服務是更多的一種方式?

回答

2

據我瞭解你的問題是類型工人隊列模型生產者消費者模型)。意圖服務意味着要做到這一點。你應該使用服務,只要你需要做多線程。您可以使用IBinder界面與Activity和Service進行通信。

的AsyncTask只是一個專門的線程,這樣就可以輕鬆地更新你的UI。但對於你的情況IntentService似乎是最好的選擇。

+0

你錯了: *請注意,與其他應用程序對象一樣,服務在其宿主進程的主線程中運行。這意味着,如果你的服務要做任何CPU密集型(如MP3播放)或阻塞(如網絡)操作,它應該產生自己的線程來完成這項工作。 *服務不是線程。它不是一種自己的方式來處理主線程(以避免應用程序不響應錯誤)。 因此,它並不是當且僅當你需要多線程。 – roiberg 2013-03-20 12:14:52

+1

IntentService使用底層的AsyncTask來處理主線程@roiberg的處理。 – lilbyrdie 2013-04-16 20:27:45

+0

@roiberg正確。服務將在主線程上運行。爲了使這個答案更加清晰,服務對於多線程(線程池)或在後臺保留序列化的執行程序/處理線程很有用。 – manjusg 2015-12-28 10:14:36

5

我強烈推薦IntentService /廣播接收器的路線。避免與AsyncTask相關的討厭的配置更改問題將使您的生活變得更容易十倍。

+0

我明白了,但是不會有帶消息的標準線程也能做到這一點嗎?即使配置發生變化,活動也會從後臺線程收到消息,不是嗎? – Yar 2012-08-25 06:47:05

+1

線程將保留對原始上下文的引用。如果在配置更改後重新註冊Context /處理程序,則可以解決此問題,但Receiver路由仍然更容易。 – SeanPONeil 2012-08-25 19:47:05

0

我會用報警,這是通過AlarmManager計劃,因爲那可以設置爲檢查輪開始/轉。它具有服務的優點,但不是電池消耗的恐怖。報警應該運行多長時間的頻率,甚至包括時間的枚舉(例如1小時/天/周)。

當報警運行它可以輪詢看到當前的狀態是什麼,並做出相應的反應。例如,通知可以進入狀態欄,手機可以發出可聽見的噪音和震動。這樣做的好處是,用戶不必讓應用程序繼續運行,因爲警報將觸發廣播接收器。

報警代碼的一個例子:http://www.androidcompetencycenter.com/2009/02/android-basics-alarm-service/

17

意向服務是什麼更多的,是由意圖觸發的工作線程,執行他們的行動在一個單獨的線程,然後得到關機。它們被設計成啓動和停止。

如果你需要像一個HTTP執行的東西得到的,或者在不需要保持連接到服務器的任何情況下的互動,使用意向的服務,並得到使用廣播事件的活動通知。

如果你的應用程序需要與服務器保持連接(即永久tcp連接),我會採取的方式是有一個服務(而不是意圖之一),使用一個asynctask或更多在服務中託管的經典線程。然後,您可以使用bindToService()使活動與服務交互。

我建議不要使用活動中asynctasks。 14如在答覆中提到的一樣,你將冒險放鬆服務器的響應,以防水平/垂直視圖發生變化。

+0

你可以使用Fragments來解決旋轉問題,請點擊https://gist.github。com/daichan4649/2480065 – MSaudi 2014-02-25 08:24:43

+0

使用AsyncTask會讓你在關閉屏幕時鬆動你的服務器連接。 – albertTaberner 2016-01-10 11:36:21

相關問題