我正在尝试创建一个可以帮助我评估从Web资源下载文件的时间的应用程序。我找到了2个样本:
Download a file with Android, and showing the progress in a ProgressDialog
和
http://www.helloandroid.com/tutorials/how-download-fileimage-url-your-device
第二个示例显示较小的下载时间,但我无法理解如何使用它更新进度对话框。我觉得应该用第二种情况下的“while”表达来完成,但我找不到什么。有人可以给我任何建议吗?
UPD:
第一个代码:
try {
time1 = System.currentTimeMillis();
URL url = new URL(path);
URLConnection conexion = url.openConnection();
conexion.connect();
// this will be useful so that you can show a tipical 0-100% progress bar
int lenghtOfFile = conexion.getContentLength();
// downlod the file
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/sdcard/analyzer/test.jpg");
byte data[] = new byte[1024];
long total = 0;
time11 = System.currentTimeMillis();
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
publishProgress((int)(total*100/lenghtOfFile));
output.write(data, 0, count);
}
time22= System.currentTimeMillis()-time11;
output.flush();
output.close();
input.close();
} catch (Exception e) {}
timetaken = System.currentTimeMillis() - time1;
第二段代码:
long time1 = System.currentTimeMillis();
DownloadFromUrl(path, "test.jpg");
long timetaken = System.currentTimeMillis() - time1;
其中
public void DownloadFromUrl(String imageURL, String fileName) { //this is the downloader method
try {
URL url = new URL(imageURL); //you can write here any link
File file = new File(fileName);
/*Open a connection to that URL. */
URLConnection ucon = url.openConnection();
/*
* Define InputStreams to read from the URLConnection.
*/
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
/*
* Read bytes to the Buffer until there is nothing more to read(-1).
*/
ByteArrayBuffer baf = new ByteArrayBuffer(50);
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
/* Convert the Bytes read to a String. */
FileOutputStream fos = new FileOutputStream(PATH+file);
fos.write(baf.toByteArray());
fos.close();
} catch (IOException e) {
Log.d("ImageManager", "Error: " + e);
}
所以问题是第一种方法似乎比较慢约30%。
答案 0 :(得分:2)
second example可能会运行得更快,但它会独占GUI线程。使用first approach的AsyncTask
更好;它允许GUI在下载过程中保持响应。
我发现将AsyncTask
与SwingWorker
进行比较会很有帮助,如example所示。
答案 1 :(得分:1)
第一个链接是最好的。但我无法在星期一或之后提供代码(它的家庭补偿),我可以提供全部功能。但是:
private class DownloadFile extends AsyncTask<String, Integer, String>{
@Override
protected String doInBackground(String... url) {
int count;
try {
URL url = new URL(url[0]);
URLConnection conexion = url.openConnection();
conexion.connect();
// this will be useful so that you can show a tipical 0-100% progress bar
int lenghtOfFile = conexion.getContentLength();
// downlod the file
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream("/sdcard/somewhere/nameofthefile.ext");
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
publishProgress((int)(total*100/lenghtOfFile));
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {}
return null;
}
这个班级最适合它(imho)。 publishProgress它的简单功能,你有最多两行。设置最大值并设置当前值。你在这段代码中可以看到lenghtOfFile
它是多少字节有你的文件。 total
- 当前进度(示例25来自100字节)。轻松运行这个课程:DownloadFile a = new DownloadFile(); a.execute(value,value);//or null if u not using value.
希望你理解我,我不会用英语说话。