2013-07-19 50 views
-1

我想要與AsyncTask同時(同時)下載所有文件。使用AsyncTask MultiDownloading

我想弄清楚如何同時下載多個文件。我試圖在互聯網上搜索,但沒有發現任何東西,但發現在很多應用程序中這可以完成。

我也想提高我的應用程序(Android)的穩定性,以便每次執行或刷新UI不會減慢進程--->「滯後」。

請原諒我的英語,但不要說得很好。非常感謝您。

+0

使用'executorOnExecutor'。對於平行執行task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,「http://url.com/image.png」)' – Raghunandan

+0

你應該看看這個訓練練習(它與圖像做在一起,所以你必須適應它的文件但一般情況下,你指向正確的方向):http://developer.android.com/training/displaying-bitmaps/index.html –

+0

你能解釋一個例子嗎?同時下載2個 –

回答

0

這樣創建您的下載任務:

public class NewspaperDownloader extends AsyncTask<Void, Void, File> { 

    URL urlToDownload; 

    public DownloaderTask(URL urlToDownload) { 
     this.urlToDownload = urlToDownload; 
    } 

    protected void onPreExecute() { 
     // prepare your download here 
    } 

    protected String doInBackground(Void... params) { 
     // do your download here 
     [...] 
    } 

    protected void onPostExecute(File downloadedFile) { 
     // Do something with the download 
    } 
} 

如果你不知道如何下載文件的AsyncTask在Android上,看看我的例子中我提供here

最後打電話給你下載這樣的:

// Task 1 
DownloadTask task1 = new DownloadTask(urlToDownload); 
task1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
// Task 2 
DownloadTask task2 = new DownloadTask(urlToDownload); 
task2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
// Task 3 
DownloadTask task3 = new DownloadTask(urlToDownload); 
task3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 

UPDATE從列表

下載網址:

List<URL> urls = new ArrayList<URL>(); 
urls.add(...); 
[...] 
for(URL url : urls) { 
    DownloadTask task = new DownloadTask(url); 
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} 
+0

,如果我不知道同時要運行多少次下載? –

+0

查看我的更新,例如如果您使用要下載的網址列表,並且該數字未知,只需爲列表中的每個網址創建一個任務即可。 – alex

+0

請記住,同時運行的AsyncTask的數量不是無限的,因此如果系統定義的最大池大小線程的數量已經在運行,則新任務將排隊直到正在運行的任務完成。 – alex

0

注意,使用AsyncTask可能不會給你真正的並行性你需要。問題是,在Android的不同版本中,如果我沒有記錯的話,可以同時運行的AsyncTasks的數量已從1更改爲5,然後回到1。查看此處:

https://github.com/android/platform_frameworks_base/commits/master/core/java/android/os/AsyncTask.java

這裏:

https://groups.google.com/forum/?fromgroups#!topic/android-developers/8M0RTFfO7-M

而且AsyncTasks可能會被殺死或者可能甚至無法運行。這是因爲AsyncTasks受到您無法控制的ThreadPool的支持。如果AsyncTask不符合您的需求,最好的解決方案是使用ServicesLoopers或建立您自己的ThreadPoolExecutor