我正在使用asynctask
进行下载任务,我希望显示速度和时间以及“进度百分比”。我正在DialogFragment
中使用ProgressDialog
。
解决方案
class DownloadVideoFromUrl extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
// Do your pre executing codes (UI part)...
// The ProgressDialog initializations...
}
@Override
protected String doInBackground(String... params) {
if(params.length < 2) return "";
String videoUrlStr = params[0];
String fileName = params[1];
try {
URL url = new URL(videoUrlStr);
URLConnection conection = url.openConnection();
conection.connect();
// This will be useful so that you can show a 0-100% progress bar
int fileSizeInB = conection.getContentLength();
// Download the file
InputStream input = new BufferedInputStream(url.openStream(), 8 * 1024); // 8KB Buffer
File file = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DOWNLOADS), fileName);
OutputStream output = new FileOutputStream(file);
int bufferSizeInB = 1024;
byte byteBuffer[] = new byte[bufferSizeInB];
int bytesRead;
long bytesInInterval = 0;
int timeLimit = 500; // ms.
long timeElapsed = 0; // ms.
long nlwSpeed = 0; String nlwSpeedStr = null;
long availableB = 0;
long remainingBytes = fileSizeInB;
long remainingTime = 0; String remainingTimeStr = null;
long startingTime = System.currentTimeMillis();
while ((bytesRead = input.read(byteBuffer)) != -1) { // wait to download bytes...
// bytesRead => bytes already Red
output.write(byteBuffer, 0, bytesRead);
availableB += bytesRead;
bytesInInterval += bytesRead;
remainingBytes -= bytesRead;
timeElapsed = System.currentTimeMillis() - startingTime;
if(timeElapsed >= timeLimit) {
nlwSpeed = bytesInInterval*1000 / timeElapsed; // In Bytes per sec
nlwSpeedStr = nlwSpeed + " Bytes/sec";
remainingTime = (long)Math.ceil( ((double)remainingBytes / nlwSpeed) ); // In sec
remainingTimeStr = remainingTime + " seconds remaining";
// Resetting for calculating nlwSpeed of next time interval
timeElapsed = 0;
bytesInInterval = 0;
startingTime = System.currentTimeMillis();
}
publishProgress(
"" + availableB, // == String.valueOf(availableB)
"" + fileSizeInB,
"" + bytesRead, // Not currently using. Just for debugging...
remainingTimeStr,
nlwSpeedStr);
}
output.flush();
output.close();
input.close();
} catch (Exception e) {
return "\n Download - Error: " + e;
}
return "";
}
protected void onProgressUpdate(String... progress) {
int availableB = Integer.parseInt(progress[0]);
int totalB = Integer.parseInt(progress[1]);
int percent = (availableB *100)/totalB; // here we get percentage of download...
String remainingTime = progress[3];
String nlwSpeed = progress[4];
if(remainingTime == null || nlwSpeed == null) return;
// Now show the details in UI:
// percent, remainingTime, nlwSpeed...
}
@Override
protected void onPostExecute(String result) {
// Code after download completes (UI part)
}
}
你检查过TrafficStats类了吗?里面有丰富的信息。
下面是TrafficStats的示例
如果您正在为一个网络接口寻找最大的下载/上传速度,那么wget已经移植到Android,所以您可以使用这些答案中的任何一个
private SpeedInfo calculate(final long downloadTime, final long bytesIn) {
SpeedInfo info=new SpeedInfo();
//from mil to sec
long bytespersecond = (bytesIn / downloadTime) * 1000;
double kilobits = bytespersecond * BYTE_TO_KILOBIT;
double megabits = kilobits * KILOBIT_TO_MEGABIT;
info.downspeed = bytespersecond;
info.kilobits = kilobits;
info.megabits = megabits;
return info;
}
private static class SpeedInfo {
public double kilobits = 0;
public double megabits = 0;
public double downspeed = 0;
}
private static final int EXPECTED_SIZE_IN_BYTES = 1048576; //1MB 1024*1024
private static final double EDGE_THRESHOLD = 176.0;
private static final double BYTE_TO_KILOBIT = 0.0078125;
private static final double KILOBIT_TO_MEGABIT = 0.0009765625;
问题内容: 我正在尝试使用asyncTask下载文件,但无法正常工作,没有错误消息或什么都没有,只是不下载文件…我尝试了所有操作,但似乎并没有输入…任何人都知道可以是问题吗?我在手机上测试过,网址也可以。 问题答案: 我只运行了您的代码,它对我来说很好用。该图像已下载到sdcard。 请注意,请确保在AndroidManifest.xml中设置了以下权限: 这是我得到的日志(请注意,我添加了):
在下载附件时,我得到了一个额外的类型的文件。我正在使用这是我的下载附件代码 这里是一个将作为参数和其他一些参数的类。是定义为
问题内容: 我编写了一些代码,这些代码将搜索目录并在列表框中显示文件。 我什至尝试过: 我虽然出错了… 好的,它说的Users\Hunter很好,当人们获得我的软件时,名字就没有猎人了。那么,我该如何将其命名为任何用户的下载文件夹? 问题答案: WinAPI方法SHGetKnownFolderPath是检索特殊文件夹(包括个人文件夹和下载文件夹)路径的唯一正确方法。 还有其他方法可以获得相似的结果
我正在尝试下载一个文件到目录,可以根据用户选择的任何目录变化。我将当前目录存储在一个file对象中,现在正在尝试下载该文件。文件下载,但它不下载指定的目录。那么,我可以做什么来获得所选目录中的文件。 传递给文件构造函数的名为url的字符串包含url。只是用它来检索文件名。 更新:我刚找到文件。它在手机里而不是sd卡里。它就在这个文件夹里,存储\仿真\00。不知道为什么?另外,我得到的绝对路径是St
问题内容: 我有以下网址: 我尝试下载文件: 这产生了一个名为“ test.xls”的文件,但这显然是一个html文件。如果我在firefox中打开了html文件,则打开了一个excel文件,但是如果我在excel中打开了文件,那绝对不是我要找的excel文件。 如果我有一个与上述地址相同的网址,如何使python将excel文件下载为excel文件? 问题答案: 这会将excel文件保存在运行脚