2014-12-05 72 views
3

我有一個可以使用互聯網連接下載數據的應用程序。我使用HttpURLConnection來做到這一點。下載時限制帶寬

問題:我的應用程序耗盡了互聯網帶寬,因此用戶將在他們的瀏覽器上緩慢瀏覽。我想讓它們自己設置帶寬限制,而不是像this site。我已經知道了。

問題:如何設置下載時的帶寬限制?例如:500 KB/s(千字節每秒)。

這裏是我的方法來下載文件:

// These are the status codes. 
public static final int DOWNLOADING = 0; 
public static final int PAUSED = 1; 
public static final int COMPLETE = 2; 
public static final int CANCELLED = 3; 
public static final int ERROR = 4; 

private long downloaded; 
private int status; 

private void downloadFile(String requestUrl) throws IOException { 

    InputStream stream = null; 
    RandomAccessFile output = null; 
    status = DOWNLOADING; 
    downloaded = 0; 
    URL url = new URL(requestUrl); 

    try { 
     System.setProperty("http.keepAlive", "false"); 
     output = new RandomAccessFile(my_directory, "rw"); 

     // Open connection to URL. 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setConnectTimeout(5000); 
     connection.connect(); 

     // Make sure response code is in the 200 range. 
     int statusCode = connection.getResponseCode(); 
     if (statusCode != 200) { 
      status = ERROR; 
     } 

     stream = connection.getInputStream(); 
     while (status == DOWNLOADING) { 
      byte buffer[] = new byte[1024]; 

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

      // Write buffer to file. 
      output.write(buffer, 0, read); 
      downloaded += read; 
     } 
     status == COMPLETE; 

    } catch (Exception e) { 
     status = ERROR; 
    } finally { 
     if (output != null) { 
      try { 
       output.close(); 
      } catch (Exception e) {} 
     } 

     // Close connection to server. 
     if (stream != null) { 
      try { 
       stream.close(); 
      } catch (Exception e) {} 
     } 
    } 
} 

回答

-1

你可以有偏好像下載移動數據/ WIFI /在你設置的活動漫遊。你可以得到這個類的連接類型。

/** *檢查設備的網絡連接和速度* @author最大 https://stackoverflow.com/users/801646/max * */public類 連接{

/** 
* Get the network info 
* @param context 
* @return 
*/ 
public static NetworkInfo getNetworkInfo(Context context){ 
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    return cm.getActiveNetworkInfo(); 
} 

/** 
* Check if there is any connectivity 
* @param context 
* @return 
*/ 
public static boolean isConnected(Context context){ 
    NetworkInfo info = Connectivity.getNetworkInfo(context); 
    return (info != null && info.isConnected()); 
} 

/** 
* Check if there is any connectivity to a Wifi network 
* @param context 
* @param type 
* @return 
*/ 
public static boolean isConnectedWifi(Context context){ 
    NetworkInfo info = Connectivity.getNetworkInfo(context); 
    return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI); 
} 

/** 
* Check if there is any connectivity to a mobile network 
* @param context 
* @param type 
* @return 
*/ 
public static boolean isConnectedMobile(Context context){ 
    NetworkInfo info = Connectivity.getNetworkInfo(context); 
    return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE); 
} 

/** 
* Check if there is fast connectivity 
* @param context 
* @return 
*/ 
public static boolean isConnectedFast(Context context){ 
    NetworkInfo info = Connectivity.getNetworkInfo(context); 
    return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(),info.getSubtype())); 
} 

/** 
* Check if the connection is fast 
* @param type 
* @param subType 
* @return 
*/ 
public static boolean isConnectionFast(int type, int subType){ 
    if(type==ConnectivityManager.TYPE_WIFI){ 
     return true; 
    }else if(type==ConnectivityManager.TYPE_MOBILE){ 
     switch(subType){ 
     case TelephonyManager.NETWORK_TYPE_1xRTT: 
      return false; // ~ 50-100 kbps 
     case TelephonyManager.NETWORK_TYPE_CDMA: 
      return false; // ~ 14-64 kbps 
     case TelephonyManager.NETWORK_TYPE_EDGE: 
      return false; // ~ 50-100 kbps 
     case TelephonyManager.NETWORK_TYPE_EVDO_0: 
      return true; // ~ 400-1000 kbps 
     case TelephonyManager.NETWORK_TYPE_EVDO_A: 
      return true; // ~ 600-1400 kbps 
     case TelephonyManager.NETWORK_TYPE_GPRS: 
      return false; // ~ 100 kbps 
     case TelephonyManager.NETWORK_TYPE_HSDPA: 
      return true; // ~ 2-14 Mbps 
     case TelephonyManager.NETWORK_TYPE_HSPA: 
      return true; // ~ 700-1700 kbps 
     case TelephonyManager.NETWORK_TYPE_HSUPA: 
      return true; // ~ 1-23 Mbps 
     case TelephonyManager.NETWORK_TYPE_UMTS: 
      return true; // ~ 400-7000 kbps 
     /* 
     * Above API level 7, make sure to set android:targetSdkVersion 
     * to appropriate level to use these 
     */ 
     case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11 
      return true; // ~ 1-2 Mbps 
     case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9 
      return true; // ~ 5 Mbps 
     case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13 
      return true; // ~ 10-20 Mbps 
     case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8 
      return false; // ~25 kbps 
     case TelephonyManager.NETWORK_TYPE_LTE: // API level 11 
      return true; // ~ 10+ Mbps 
     // Unknown 
     case TelephonyManager.NETWORK_TYPE_UNKNOWN: 
     default: 
      return false; 
     } 
    }else{ 
     return false; 
    } 
} 

}

+0

對不起,它沒有給出確切的限制。 – 2015-02-13 11:38:03

+0

這不*設置*一個限制,只是提供各種信息。 – EJP 2015-03-15 05:51:45

1

如果你有一個Socket你可以將接收緩衝區大小設置爲所需的帶寬延遲產品,但是,如果您不這樣做,則只需在接收呼叫之間休眠即可。實驗或某些基於反饋的算術將產生適當的睡眠間隔。