2014-12-05 71 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你可以将接收缓冲区大小设置为所需的带宽延迟产品,但是,如果您不这样做,则只需在接收呼叫之间休眠即可。实验或某些基于反馈的算术将产生适当的睡眠间隔。