我建立一個Android應用程序與定期的服務器,只要應用程序正在運行通信與服務器通信。最佳實踐來使用線程
我爲此通過發起與服務器的連接時,應用程序開始,然後我有用於接收稱爲ReceiverThread
消息單獨thread
,這thread
讀取來自socket
消息,分析它,並將其轉發到適當的部分的應用程序。
這個thread
運行在一個循環中,讀取任何需要讀取的內容,然後在read()
命令上阻塞,直到新數據到達,所以它花費了大部分時間。
我處理,通過不同的線程中發送消息,稱SenderThread
。我想知道的是:我應該以類似的方式構建SenderThread
嗎?這意味着我應該保持某種形式的隊列這個線程,讓它發出的所有消息隊列,然後阻塞,直到新郵件進入隊列,或者我應該只是啓動線程的新實例每個需要發送郵件時,讓它發送消息,然後「死」?我傾向於第一種方法,但我不知道究竟是好無論是在性能方面(保持阻塞的線程在內存與初始化新線程),並在代碼的正確性方面。
此外,由於所有的活動都需要能夠發送和接收我的Application
類,我抱着兩個線程參考消息,是一個可以接受的方法,或者我應該有不同的實現呢?我曾與此遇到
的一個問題是,有時如果我關閉我的應用程序並再次運行它實際上我ReceiverThread的兩個實例,讓我得到一些消息的兩倍。
我猜測,這是因爲我的應用程序實際上並沒有關閉與前一個線程仍然活躍的(被阻擋在read()
操作),當我再次打開該應用程序的線程被初始化,但都被連接到服務器使服務器將消息發送給兩者。有關如何解決此問題的任何提示,或有關如何徹底重新組織它以確保正確的提示?
我試圖查找這些問題,但發現我的第一個問題,一些相互矛盾的例子,並沒有什麼是足夠有用,適用於我的第二個問題...
「關閉」了應用程序並沒有真正殺死它。它只是繼續運行,尤其是線程不會自動停止 – zapl
@zapl是的我意識到這一點,這是我的問題。問題是:如何可靠地停止線程?或者如何以避免此問題的方式實施相同的整體應用程序? – Bob
這確實很棘手。 'Thread#interrupt()'(+'Socket#close()')可以用來停止它,但最難的部分是跟蹤應用程序是在運行還是在後臺閒置。例如,每個活動都可以從'onStop'上的'onStart'完成。 – zapl