2016-06-22 4 views
1

Ich versuche, einen Download-Geschwindigkeitstest zu berechnen berechnen. Eine Menge Informationen in Stackoverflow gefunden, aber nichts hilft mir. Die endgültige Berechnung ist keine Logik. Versucht, die Download-Geschwindigkeit im While-Thread zu kennen. Anbei mein Code, den ich gefunden habe.Android berechnen Download-Geschwindigkeitstest

public void run() { 
      OutputStream out = null; 
      URLConnection conn = null; 
      InputStream in = null; 
      try 
      { 
       URL url1 = new URL("test"); 
       out = new BufferedOutputStream(new FileOutputStream(getVideoFile().getPath())); 
       conn = url1.openConnection(); 
       in = conn.getInputStream(); 
       long start = System.currentTimeMillis(); 
       byte[] buffer = new byte[1024]; 
       int numRead; 
       long numWritten = 0; 
       while ((numRead = in.read(buffer)) != -1) 
       { 
        out.write(buffer, 0, numRead); 
        numWritten += numRead; 

        long end = System.currentTimeMillis(); 

        if ((end - start)>0) { 
         double rate = 1000f * numWritten/(end - start) ; 
         Log.d("downloadmanager","speed "+rate); 
        } 
       } 


      } 
      catch (Exception ex) 
      { 
       Log.d("downloadmanager","Unknown Error: " + ex); 
      } 
      finally 
      { 
       try 
       { 
        if (in != null) 
        { 
         in.close(); 
        } 
        if (out != null) 
        { 
         out.close(); 
        } 
       } 
       catch (IOException ex) 
       { 
        Log.d("downloadmanager", "Unknown Error: " + ex); 
       } 
      } 
     } 
    }).start(); 

Vielen Dank für Ihre Hilfe.

+0

was meinst du mit * ist nicht logisch. *? – Blackbelt

+0

Die Zahlen sind sehr hoch und ich bin mir nicht sicher, ob die Berechnung richtig ist. –

Antwort

1

Ich habe so versucht, hoffe, es wird helfen!
Die Änderung ist, ich habe eine Reihe von URLs verwendet.

public class TestSpeed extends AsyncTask<Void,Void,Void> { 


    String TAG = "TestSpeed"; 
    long startTime,endTime,contentLength; 
    String vURL[] = { 
      "http://test/url/file1", 
      "http://test/url/file2", 
      "http://test/url/file3", 
      "http://test/url/file4", 
      "http://test/url/file5", 
      "http://test/url/file6", 
      "http://test/url/file7" 
      "http://test/url/file8" 
    }; 

    @Override 
    protected Void doInBackground(Void... params) { 
     setCall(vURL[GlobalData.URLIndex]); 
     GlobalData.URLIndex += 1; 
     if(GlobalData.URLIndex >= vURL.length){ 
      GlobalData.URLIndex = 0; 
     } 
     return null; 
    } 

    void setCall(String URL){ 
     try { 
      Log.d(TAG,"Start " + URL); 
      startTime = System.currentTimeMillis(); //Hold StartTime 
      HttpGet httpRequest = new HttpGet(new URL(URL).toURI()); 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpResponse response = (HttpResponse) httpClient.execute(httpRequest); 
      endTime = System.currentTimeMillis(); //Hold EndTime 

      HttpEntity entity = response.getEntity(); 
      BufferedHttpEntity bufHttpEntity; 
      bufHttpEntity = new BufferedHttpEntity(entity); 

      //You can check the size of your file 
      contentLength = bufHttpEntity.getContentLength(); 

      // Log 
      Log.d("TAG", "Dowload time :" + (endTime - startTime) + " ms"); 
      // Speed : size(KB)/time(s) 
      Long mSpeed = contentLength/((endTime - startTime) * 1000); 
      Log.d(TAG, "mSpeed :" + mSpeed); 

      Double duration = Double.valueOf((endTime - startTime)); 
      Double speedKbps = Double.valueOf(roundTwoDecimals(Double.valueOf(contentLength/1024))); 
      Double speedMbps = roundTwoDecimals(speedKbps/1024); 
      Log.d(TAG,"" + speedKbps); 
      Log.d(TAG,"" + speedMbps); 

      //confirm units for display 
      String mTheSpeed = "" + speedMbps; 
      String speed; 
      if(mTheSpeed.charAt(0) == '0'){ 
       speed = roundTwoDecimals(speedKbps) + " kb/s"; 
      }else{ 
       speed = roundTwoDecimals(speedMbps) + " mb/s"; 
      } 

      Log.d("Speed Result: ","" + speed); 

     }catch (Exception ex){ 
      ex.printStackTrace(); 
     } 
    } 

    Double roundTwoDecimals(Double vLongValue) 
    { 
     DecimalFormat twoDForm = new DecimalFormat("#.###"); 
     return Double.valueOf(twoDForm.format(vLongValue)); 
    } 
} 

für eine Alternative Sie mit dem WifiInfo gehen kann, sieht der Code wie folgt.

private static Integer wifiSpeed(Context mContext){ 
     WifiManager wifiManager = (WifiManager); 
     mContext.getSystemService(Context.WIFI_SERVICE); 
     WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
     Integer wifiSpeed = wifiInfo.getLinkSpeed(); 
     return wifiSpeed; 
} 
Verwandte Themen