我正在从Web服务获取文件列表,然后使用AsyncTask来处理所有文件的下载。每个任务都是在循环中创建的:
for(int i = 0; i < arraySize; i++) {
//Omitted all code except for the portion that fires the asynctask
//Download the PDF
DownloadHandler dhpdf = new DownloadHandler(cleanLink, fileName, p1, DownloadPosters.this, "pdf");
dhpdf.startDownload();
//Download the PNG
DownloadHandler dhpng = new DownloadHandler(cleanLink, fileName, p1, DownloadPosters.this, "png");
dhpng.startDownload();
}
下载类
public class DownloadHandler extends Activity {
private Context mContext;
//File ======================
public String filename;
private String remotePath;
private File file;
private String ext;
//Progress bar ==============
private ProgressBar progressBar;
private int progressStatus = 0;
//private Handler handler = new Handler();
private TextView mTextView;
//ProgressDialog ============
ProgressDialog mProgress;
private int mProgressDialog=0;
public DownloadHandler(String rp, String f, ProgressBar progressBar, Context c, String extension, TextView textview) throws Exception {
mContext = c;
remotePath = rp;
filename = f;
file = new File(mContext.getFilesDir(), filename+"."+extension);
ext = extension;
this.progressBar = progressBar;
mTextView = textview;
}
//our method
public void startDownload() {
String url = "http://examplesite.com/"+remotePath+"/"+filename+"."+ext;
new DownloadFileAsync().execute(url);
}
class DownloadFileAsync extends AsyncTask<String, Integer, String> {
@Override
public void onPreExecute() {
}
@Override
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
mTextView.setText("Downloading: "+ext);
}
@Override
protected String doInBackground(String... aurl) {
int count;
try {
URL url = new URL(aurl[0]);
URLConnection conection = url.openConnection();
conection.connect();
// Get Music file length
int lenghtOfFile = conection.getContentLength();
// input stream to read file - with 8k buffer
InputStream input = new BufferedInputStream(url.openStream(),10*1024);
// Output stream to write file in internal storage
OutputStream output = new BufferedOutputStream(new FileOutputStream(file));
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
// Publish the progress which triggers onProgressUpdate method
publishProgress((int) ((total * 100) / lenghtOfFile));
// Write data to file
output.write(data, 0, count);
}
// Flush output
output.flush();
// Close streams
output.close();
input.close();
} catch (Exception e) {mTextView.setText("ERROR:"+e.toString());}
return null;
}
@Override
protected void onPostExecute(String unused) {
mTextView.setText("Complete");
}
}
现在我只能测试大约 6 个文件,而且它似乎运行良好。
我的问题是,这是否是排列多个下载的正确方法,并且可以一次处理100 +文件而不会崩溃吗?
为什么不使用安卓下载管理器?您可以将所有下载请求排队,这是一项服务,它将在后台运行。它还会检查您的连接,在连接消失时恢复下载并重新建立。
有关详细信息和快速入门,请查看本教程。它应该有帮助。沃盖拉博客
不是问题,但你也不应该做 100 个平行上传 - 这不会太好(技术上它应该工作,但就性能而言,这是错误的方法)。我会把它们排成队列,一个接一个地推。
请注意,根据Android版本,当以默认的"form"(new xxTask.execute()')调用时,AsyncTask
的工作方式会有所不同 - 在旧版本上,如果将并行,则永远不会一个接一个地运行。确保您始终这样做。
最后,如果你真的知道你会有 100 次上传,那么我会坐下来重新设计你的应用程序的架构 - 你肯定在那里犯了一些非常错误的东西。