当前位置: 首页 > 知识库问答 >
问题:

在AsyncTask-Android中获得下载文件的时间(&网速)

章青青
2023-03-14

我正在使用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)
    }
}

共有1个答案

朱丰
2023-03-14

你检查过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文件保存在运行脚