Frage

Ich arbeite daran, eine Datei auf einer Software herunterzuladen, das habe ich bekommen, sie habe sorgfältig heruntergeladen, und ich kann auch Fortschritte erzielen, aber noch 1 Sache, die ich nicht weiß, wie ich es tun soll. Download -Geschwindigkeit messen. Ich würde Ihre Hilfe schätzen. Vielen Dank. Dies ist der aktuelle Download -Methodencode

    public void run()
    {
        OutputStream out = null;
        URLConnection conn = null;
        InputStream in = null;
        try
        {
            URL url1 = new URL(url);
            out = new BufferedOutputStream(
            new FileOutputStream(sysDir+"\\"+where));
            conn = url1.openConnection();
            in = conn.getInputStream();
            byte[] buffer = new byte[1024];
            int numRead;
            long numWritten = 0;
            double progress1;
            while ((numRead = in.read(buffer)) != -1)
            {
                out.write(buffer, 0, numRead);
                numWritten += numRead;
                this.speed= (int) (((double)
                buffer.length)/8);
                progress1 = (double) numWritten;
                this.progress=(int) progress1;
            }
        }
        catch (Exception ex)
        {
            echo("Unknown Error: " + ex);
        }
        finally
        {
            try
            {
                if (in != null)
                {
                    in.close();
                }
                if (out != null)
                {
                    out.close();
                }
            }
            catch (IOException ex)
            {
                echo("Unknown Error: " + ex);
            }
        }
    }
War es hilfreich?

Lösung

Genauso würden Sie alles messen.

System.nanoTime() Gibt eine zurück Long Sie können messen, wie lange etwas dauert:

Long start = System.nanoTime();
// do your read
Long end = System.nanoTime();

Jetzt haben Sie die Anzahl der Nanosekunden, die Sie brauchten, um X -Bytes zu lesen. Machen Sie die Mathematik und Sie haben Ihre Download -Rate.

Höchstwahrscheinlich suchen Sie nach Bytes pro Sekunde. Verfolgen Sie die Gesamtzahl der von Ihnen gelesenen Bytes und überprüfen Sie, ob eine Sekunde verstrichen ist. Sobald eine Sekunde vergangen ist, finden Sie die Rate auf der Grundlage der vielen Bytes, die Sie in dieser Zeit gelesen haben. Setzen Sie die Gesamtsumme zurück, wiederholen Sie.

Andere Tipps

Hier ist meine Implementierung

while (mStatus == DownloadStatus.DOWNLOADING) {
            /*
             * Size buffer according to how much of the file is left to
             * download.
             */
            byte buffer[];
            // handled resume case.
            if ((mSize < mDownloaded ? mSize : mSize - mDownloaded <= 0 ? mSize : mSize - mDownloaded) > MAX_BUFFER_SIZE) {
                buffer = new byte[MAX_BUFFER_SIZE];
            } else {
                buffer = new byte[(int) (mSize - mDownloaded)];
            }

            // Read from server into buffer.
            int read = stream.read(buffer);
            if (read == -1)
                break;// EOF, break while loop

            // Write buffer to file.
            file.write(buffer, 0, read);
            mDownloaded += read;
            double speedInKBps = 0.0D;
            try {
                long timeInSecs = (System.currentTimeMillis() - startTime) / 1000; //converting millis to seconds as 1000m in 1 second
                speedInKBps = (mDownloaded / timeInSecs) / 1024D;
            } catch (ArithmeticException ae) {

            }
            this.mListener.publishProgress(this.getProgress(), this.getTotalSize(), speedInKBps);
        }

Ich kann Ihnen eine allgemeine Idee geben. Starten Sie zu Beginn des Downloads einen Timer. Jetzt multiplizieren Sie die (percentage downloaded) bis zum download size, und teilen Sie es durch die time elapsed. Das gibt Ihnen die durchschnittliche Download -Zeit. Ich hoffe, ich komme dich auf den richtigen Weg!

Sie können verwenden System.nanoTime(); Wie von Brian vorgeschlagen.

Stellen long startTime = System.nanoTime(); außerhalb Ihrer Weileschleife. und

long estimatedTime = System.nanoTime() - startTime; Geben Sie Ihnen die verstrichene Zeit in Ihrer Schleife.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top