我有一個應用程序,用戶可能需要下載最多760個文件,總計大約350MB。這是不是可能壓縮這些文件,它們必須作爲鬆散的文件下載!用於異步下載數百個文件的解決方案
我目前使用Android Asynchronous Http Client下載單個文件,而AsyncTask
運行整個過程。
這裏有一個DownloadThread
對象,處理下載數百個文件在後臺的一個例子:
public class DownloadThread extends AsyncTask<String,String,String> {
ArrayList<String> list;
AsyncHttpClient client;
String[] allowedContentTypes = new String[] { "audio/mpeg" };
BufferedOutputStream bos;
FileOutputStream fos;
@Override
protected String doInBackground(String... params) {
DownloadTask task;
for (String file : list) {
//the "list" variable has already been populated with hundreds of strings
task = new DownloadTask(file);
task.execute("");
while (!task.isdone)
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
class DownloadTask extends AsyncTask<String, String, String> {
String character, filename;
boolean isdone = false;
public DownloadTask(String file) {
//file = something like "Whale/sadwhale.mp3"
character = file.split("/")[0];
filename = file.split("/")[1];
}
@Override
protected void onPreExecute() {
}
@Override
protected void onPostExecute(String result) {
if (!result.equals("Error")) {
//Do something on success
}
isdone = true;
}
@Override
protected String doInBackground(String... str) {
client = new AsyncHttpClient();
client.get("http://some-site.com/sounds/" + character + "/"
+ filename, new BinaryHttpResponseHandler(
allowedContentTypes) {
@Override
public void onSuccess(byte[] fileData) {
try {
// Make file/folder and create stream
File folder = new File(Environment
.getExternalStorageDirectory()
+ CharSelect.directory + character);
folder.mkdirs();
File dest = new File(folder, filename);
fos = new FileOutputStream(dest);
bos = new BufferedOutputStream(fos);
// Transfer data to file
bos.write(fileData);
bos.flush();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
});
return "Success";
}
}
}
DownloadThread
在後臺運行,並呼籲數以百計它自己AsyncTasks
的。它會等待任務完成下載,然後繼續執行每個下載的for
循環。
這工作,有點。某些下載似乎無法正常完成或根本無法啓動。在760次下載列表中,平均100次下載完成正確,我必須重新啓動該過程再下載另外100次下載,直到該次下載失敗。我有一種感覺,這是由於計時問題,因爲Thread.sleep(10)
行似乎有點「hackish」。
當然,從另一個AsyncTask
調用數百個AsyncTasks
並不是實現此目的最有效的方法。我如何更改此代碼或實施第三方解決方案以適應此任務?
他們真的需要異步下載嗎?我覺得把他們放在隊列中,一次下載一個就沒問題。 – FDinoff
它並沒有_have_,但通過這種異步操作,我可以(最終)一次管理2或3次下載,從而提高整體速度。當然,我首先需要一個可靠的方法。 – Snailer