2012-02-10 50 views
12

有場景,我將不得不花費六個HTTP調用到我的服務器,以獲得六個不同的項目的數據。這些服務器調用不能合併,它們就是這樣的。例如:如果您需要GOOGLE的引用信息,則請求服務器請求Google的引用信息。接下來,如果你需要雅虎,那麼你發起另一個http調用,等等。我如何管理多個異步任務有效地在Android的

這裏的情況是:

  1. 現在我的最終用戶希望比較6級不同的公司。
  2. 正如我提到的其未避免的,我做我不使用6個異步任務對其中6 HTTP調用。
  3. 當我得到每一個Async任務響應時,我將用新數據刷新UI。
  4. 如果我在很短的時間內刷新用戶界面6次,這是一種糟糕的用戶界面體驗。
  5. 它給我的用戶界面,這是不希望的閃爍效果。

我的問題:

  1. 我怎麼能裝客從刷新UI,直到我得到的所有6層異步任務的反應?
  2. 我明白每個任務是相互獨立的。我應該運行一個while循環並等待,直到我得到所有的響應?
  3. 是否有更好的方法來做到這一點,而不是一個while循環,因爲如果呼叫中的任何一個沒有響應,那麼我將永遠堅持等待。

注:我猜的Android 1.6+做並行執行異步任務。

這更是一個設計問題,我將不勝感激任何幫助。

在此先感謝

回答

1

我發現這個解決方案更適合我的問題。 此鏈接描述了建立此的幾種方法。 1. ExecutorService的 2. ExecutoreService和CountDownLatch

ExecutoreService and CountDownLatch

+0

我認爲這種方法不適合於一個活動,因爲CountDownLatch await方法會阻塞,直到所有任務完成並阻止UI線程不應該完成爲止。 – AndroidGuy 2013-03-12 20:57:43

+0

countDownLatch位於主AsyncTask上,該AsyncTask產生子任務來完成實際的工作。完成所有子任務後,主任務會合並所有結果並返回到UI線程 – AKh 2013-03-13 19:00:17

+0

這在Android上如何工作? – 2015-03-18 19:54:47

1

的方法有很多,你可以處理此:

  • 另一個AsyncTask是彙總來自網絡任務的響應。
  • 每執行一個sendEmptyMessageDelayed(),例如500ms到您的Activity創建的Handler,刷新網絡任務中的數據並繼續執行,直到處理完所有網絡結果。
  • 執行聚合的線程。

沒有我,我可能會去Handler。綜上所述,讓您的網絡任務將數據存儲在一些中間存儲中。將延遲的消息發送給處理程序,並在handleMessage()內檢查中間存儲中的數據以及後更新的結果。如果有未完成的結果,請再次發佈延遲的消息。

4

你可以做的AsyncTask池對象,允許你欺騙「批」 HTTP調用。

  1. 創建AsyncTasks可觀察到的集合,我將把這個集合作爲游泳池
  2. 您的活動創建AsyncTasks(但不執行還),並將它們添加到池
  3. 活動將自己註冊爲池的觀察者
  4. 活動告訴池執行,池依次調用其每個任務的執行
  5. 當任務完成時(對於成功和失敗),它們將響應數據存儲在池中,池將該任務標記爲「完成」
  6. 一旦所有任務都標記爲已完成,游泳池通知監聽活動

總體思路是泳池知道有多少任務和待處理,並保存完成的呼叫的彙總數據。一旦完成,通知觀察活動並傳回所有數據。

您將不得不計算AsyncTasks如何告知Pool它們已完成。也許只需要一個AsyncTask的實現,它在其構造函數上接受一個Pool,以便任務具有對Pool的引用。

1

只是刺在這裏黑,但您有:具有

  • 1個主UI線程
  • 6X背景asynchtasks:6X在後臺執行的方法 6x將數據返回到UI的方法(前臺)

爲什麼沒有在UI線程公開範圍的變量說叫「finishedTasks」,然後在每個6X返回數據的線程的相同方法:

  • 增量finishedTasks

  • 如果finishedTasks == 6然後運行1種public方法做的UI

更新那麼這將更新所有背景asychtasks完成UI。