2012-02-24 96 views
-1

我有一個關於在an​​droid上構建基於UDP的聊天客戶端的學校任務。現在,我的第一個想法是創建一個啓動服務的活動,並且該服務處理所有網絡和活動的所有輸入和輸出。但是有一個問題。Android上的UDP聊天

如果我嘗試啓動服務,以便startCommand函數啓動並調用socket.receive來開始接收網絡消息,那麼我無法綁定服務,因此我可以將活動的輸入傳遞給服務(input =用戶想要發送的消息)。它只是掛起,並引發ANR異常。如果我只綁定它(以便接收永遠不會被調用),它就像一個魅力。

也許我沒有接近這個問題的權利。或者它應該工作來綁定服務,這是一個阻止接收電話?

+0

沒有看到代碼,很難診斷。我的第一個猜測是你在服務的線程(這是主UI線程)中運行你的網絡功能。這會阻止它,你會得到一個ANR。您應該始終在單獨的線程中運行網絡調用。 – 2012-02-24 02:32:28

回答

1

我做了一次這樣的事情。我採取了必要的數據追蹤其他設備,並將其饋入一個asyncTask,在那裏我啓動了一個基本上保持連接在後臺運行的Runnable(這樣你就不必擔心綁定了),我發現而不是使自己的套接字連接更容易使用Apache MinaNetty。 (不需要重新發明輪子)。如果您只是將數據傳輸從後臺運行的會話傳遞到列表或隊列,並且有一個asyncTask檢查並相應地更新UI,則您應該全部設置爲聊天。也許這不是最好的方式,但它對我有用。希望有些幫助。

+0

感謝您的回答,但分配的重點是重新發明輪子...所以我需要使它與基本的UDP一起工作。 – Mockarutan 2012-02-24 03:48:04

+0

這很好,它聽起來像你有你的套接字在android操作系統之外工作。所以像alextsc暗示我認爲你與服務的工作方式混淆。服務與線程不一樣。即使你綁定了一個服務,你仍然需要爲你的接收者創建一個單獨的線程,併爲你發送的消息調用一個新的線程。所以你可以在任何時候運行在UI上運行的發送者,接收者和活動的三個線程。 – shibbybird 2012-02-24 04:32:59

+0

AsyncTask做到了!感謝您的答案! – Mockarutan 2012-02-24 11:40:06