2015-12-24 77 views
-1

我必須同時在api中發送四個不同的請求。我是否需要爲每個請求創建AsyncTask後臺線程,或者是否可以通過一個AsyncTask完成所有請求。有人可以請幫忙嗎?同時發出多個請求的最佳做法

+0

針對所有人的單獨異步任務 –

+0

您可以考慮使用像Volley這樣的networklib來爲您處理多個異步請求,而不會使您的代碼變得不復雜 – Stefan

+0

@VivekMishra這幾乎肯定不是真的。我將查找它在Java中的工作原理並嘗試發佈答案,但HTTP(特別是HTTP/2)有許多方法來簡化進行多個請求的過程。 –

回答

1

這是一個併發問題。在Android中有幾十種方法可以做到這一點。我已經寫過幾乎所有的課程,涵蓋了這些材料......即使這樣,它也不是「簡單」的。

我個人使用哈默(處理程序,信息,可運行)的Android框架。創建4個runnables並讓他們將結果發佈到Handler。

但是...這不是最容易實現的。並需要您瞭解如何安全地(正確利用了WeakReference的,等等)創建自己的自定義處理

因此,我建議在ExecutorService的

myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);默認運行的AsyncTask(S)線程池執行器應該從4個線程開始(我相信不用查看它)。

+0

我同意使用ThreadPoolExecutor。我已經將它用於我最近的一個項目。它可以在幾秒鐘內完成你真正獨立的任務,只要沒有像conn.getResponseCode()這樣的阻塞調用。 – RaViMete

0

我假設你正在使用HttpURLConnections。不幸的是,這些連接中的每一個,如the documentation中所述,都只能處理單個請求。

但是,您可以(並且可能應該)仍然執行單一的AsyncTask所有請求。 每個AsyncTask都需要創建一個需要大量時間和資源的新線程。因此,不要聽任何告訴你爲每個請求創建新任務的人。

您也可以選擇利用HTTP持久性。如果您通過connection.setRequestProperty("Connection", "Keep-Alive");將標題Connection: Keep-Alive添加到您的請求中,您將能夠通過同一連接發送多個請求,並節省大量時間和資源。

這是在Java中有點複雜,因爲一個請求每HttpURLConnection的規則,但它可以做到的。首先,當您完成第一個請求的HttpURLConnection 時,請不要關閉該連接。然後,要創建下一個連接,請撥打url.openConnection(),與您用於創建第一個HttpURLConnection的URL對象相同。如果可能的話,JVM將知道重用該連接以節省帶寬。

您還可以使用HTTP/2.0複用,它可以讓你在同一時間從字面上發送多個請求的選項。不幸的是,我在HTTP/2.0中還不夠精通,告訴你如何使用這個,但是包含了多路複用功能來解決這個問題。