2012-10-19 64 views
10

我工作的一個Android應用程序,需要一個TCP連接到TCP服務器(寫在Node.js的)Android的TCP連接的最佳實踐

我的Android TCP客戶端工作的可以發送郵件來回。

我spesific的問題是:

  1. 什麼是處理一個TCP連接到Android中的服務器的最佳方式?
  2. 如何保持連接(關閉連接onDestroy()等)?
  3. 是否有再利用的AsyncTask(除正常的Thread類,這是不是在Android 4.0的允許)

我有這樣的一個的AsyncTask我的套接字連接任何bether方式:

@Override 
protected Void doInBackground(Void... params) { 
     try { 
      Log.d("TCP_MESSAGE", "Connecting..."); 

       socket = new Socket(MY_LOCAL_IP, 8080); 
       dataOutput = new DataOutputStream(socket.getOutputStream()); 

       inputstream = new InputStreamReader(socket.getInputStream()); 
       input = new BufferedReader(inputstream); 


      while (!canceled) { 
       String message = input.readLine(); 
       handleMessage(message); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    return null; 
} 

我在AsyncTask中建立連接的原因是因爲我使用的是android 4.0,並且不允許在普通線程中使用網絡代碼。

+2

你是說在4.0中不允許使用Thread?那是不正確的。但無論如何看到我的答案在下面。 –

+0

你錯了4.0中的線程。你不能做的是** ** MAIN **線程中的網絡代碼。 – m0skit0

+0

Okey。當我使用一個正常的線程時(我發現其他線程出現了相同的問題),我得到了一個異常。但我確實認爲這有點奇怪,我猜你說得對。 – Emil

回答

6

服務應該擁有連接。如果您的應用程序未運行時需要保持連接,則應將其設置爲前臺服務。如果您沒有將其作爲前臺服務,請確保綁定到您的活動中的服務以保持活動狀態。

不要忘記,該服務也在主(UI)線程上運行,因此您仍然需要單獨的線程來處理通信。

如果您只有一個活動,並且只是想要處理由於配置更改而重新啓動,那麼您可以自己處理配置更改,保持非ui片段擁有的連接,或使用onRetainNonConfigurationInstance將連接傳遞給自己)/ getLastNonConfigurationInstance()(但不贊成使用片段)。

+0

我不知道你爲什麼在討論服務。他沒有提到任何地方的服務,或者是在應用程序死機時談到維持聯繫。事實上,他表示他希望連接在'onDestroy()'回調中被銷燬... – m0skit0

+4

不,但他詢問了保持連接的最佳方法,如果要保持活動之間的連接和配置更改。 –

+1

在這種情況下保持連接**的最佳方式** – m0skit0

2

在Android中處理與服務器的TCP連接的最佳方式是什麼?

這很大程度上取決於您的應用程序的複雜性以及您想要如何處理它。 Android聯網沒有具體細節。

如何保持連接(關閉連接在 onDestroy()等)?

無論何時打開套接字並將其保留爲類字段。當調用onDestroy()時關閉它。確保你先檢查它是不是null

有什麼bether方式再使用的AsyncTask(除正常的線程 類,這是不是在Android 4.0的允許)

您可以在Android 4.0的(API14)使用普通Java線程。您可能會產生困惑:Android中不允許在主線程中使用網絡代碼(UIThread)。

+0

是的,我錯了Android 4.0中的線程。我關閉onDestroy()的連接,但關閉線程我不是那麼容易。但是,謝謝你的回覆。 – Emil

+1

這是爲什麼?線程在退出'run()'時死掉。 – m0skit0

+0

downvote的解釋? – m0skit0