2014-07-05 44 views
1

在我的應用程序中,我需要進行一些TCP套接字調用。從Android的工作線程內部創建線程

爲了能夠做到這一點,我必須做以下步驟:1。 我的數據/指令轉換成字節流 2.創建套接字,併發送指令和接收響應爲 3.解析響應和存儲用戶界面。

現在我創建了一個後臺線程,可以完成所有三個步驟。

但是在我的套接字客戶端中,我還想爲每個新命令創建一個新線程(步驟#2) 因此,這意味着我在上述三個步驟中的普通工作線程中都有大量工作線程。

因此,對於已經發生在工作線程中的步驟#2使用異步任務是否可行?或者我在這種情況下使用普通線程。

有人可能會問爲什麼我不能在一個工作線程中實現所有三個步驟。 問題是,即使我爲所有套接字命令創建了一個工作線程,第1步的初始請求可能本身也可能來自工作線程。

因此,我不能僅僅假設來自主UI線程的調用。 此外,我想問是否不建議在android中創建自己的工作線程,爲什麼?

感謝, 陽光

回答

0

形成你的第2段我明白你想通過套接字建立一些溝通。我不認爲這是一個很好的方法來創建一個線程每個命令線程本身和開放/關閉套接字是昂貴的操作。 我會建議創建只有一個線程打開和監控/寫入/從套接字讀取數據。如果這些命令比頻繁打開/關閉套接字更頻繁地維護一個套接字是比較合適的。可選地,我會創建一個額外的線程來完成序列化/反序列化命令的額外工作(如果它們耗時的話)。

有人可能會問爲什麼我不能在一個工作線程中實現所有三個步驟。重點在於,即使我爲所有套接字命令創建了一個工作線程,第1步的初始請求也有可能來自工作線程。

我不認爲這會對您的設計方法產生重大影響,請求來自何處。

因此,我不能僅僅假設來自主UI線程的調用。此外,我想問問是否不建議在android中創建自己的工作線程,爲什麼?

Android提供了一些非常好的泛型類,例如AsyncTask和HandlerThread用於一般用途,但任何人都可以自由創建工作線程,如果上述不符合設計要求的話。我個人創建自己的工作線程,如果我處理套接字編程。

我建議看看Java NIO庫專門選擇器和SocketChannel類

0

不能使用的AsyncTask了點。

AsyncTasks只能是instantiated and executed on the UI thread

但是,您可以使用標準線程。

類MyThread的{

@override 
    public void run() { 
      ...... 
      // when needed - span a new working thread fro within old one 
      new MyOtherThread(...).start(); 
    } 

}

沒有問題在這裏。

如果您覺得您產卵的線程數可能失控,那麼使用thread pool是一個聰明的主意。 java.util.concurrent包有幾個例如 ThreadPoolExecutor。


最後,我以前也多次給這個建議,如果你的任務 是使用多線程架構來傳輸大量的小物件,用 Volley可能是最有效的方法走。

祝你好運。