2012-11-11 82 views
4

我正在爲my local cinematheque寫一個粉絲應用程序,它顯示了未來幾天的篩選日曆。每天的電影列表使用網站上的parametrized HTTP call檢索(答案中包含希伯來語,所以如果您點擊鏈接並獲得一些垃圾信息,則可能是好的)。Android:AsyncTask中的HTTP請求不是併發

該應用程序顯示接下來的八天的時間表,所以它使8個電話與每日日程安排請求。

private class GetMoviesTask extends AsyncTask<Integer, Void, List<Film>> 

doInBackground()檢索每天影片列表,並onPostExecute()更新的接口。

的的AsyncTask從MainActivity.onCreate()稱爲:

for (int i=0; i<NUMBER_OF_DAYS_TO_VIEW; i++){ 
    new GetMoviesTask().execute(i); 
} 

的問題是,的AsyncTask不同時執行。日子慢慢地加載了一個又一個,這是痛苦的緩慢:

enter image description here

enter image description here

enter image description here

什麼是同時啓動這些AsyncCalls的最佳方式?

+0

爲什麼它必須是平行的?爲什麼不按順序打呢? – st0le

+0

@ st0le在這種情況下,我會認爲順序HTTP調用是一種專業尷尬。爲什麼在我能夠提供'〜TIME_PER_CALL'中的信息時,讓用戶等待'8 *(TIME_PER_CALL)'? –

回答

11

AsyncTask已經知道打的Android 4.x中,在系統執行這些一次一個而不是併發執行的他們,因爲它做了一個迴歸自Android 1.6以來。這是設計的:基本上,在較新的平臺上,您可以通過調用executeOnExecutor()而不是​​來恢復到舊的併發行爲。 Mark Murphy(在StackOverflow上稱爲Commonsware)在其博客上有all the details sorted

+0

現貨。感謝鏈接! –

0

基本上AsyncTask只爲你創建一個線程在後臺運行。

你可以通過兩種方式實現你想要的。

  • 首先,您可以爲每個操作創建單獨的AsyncTasks。
  • 其次,通過在doInBackground方法中創建多個線程並創建併發請求和進程。之後,您可以通過將它們發佈到onProgressUpdate或onPostExecute來通知您的用戶界面。

入住這

android asynctask with threading