2014-12-05 2 views
3

У меня есть приложение, которое может использовать подключение к Интернету для загрузки данных. Для этого я использую HttpURLConnection.Ограничение полосы пропускания при загрузке

Проблема: Мое приложение истощает пропускную способность интернета, поэтому пользователи будут медленно просматривать их браузер. Я хочу сделать их необязательными, чтобы установить ограничение пропускной способности самостоятельно, а не как this site. Я знал об этом.

Вопрос: Как установить ограничение пропускной способности во время загрузки? Например: 500 КБ/с (KiloBytes в секунду).

Вот мой метод для загрузки файла:

// 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

Вы можете иметь предпочтение, как загрузить в мобильных данных/Wi-Fi/Роуминг в вашей деятельности настройки. Вы можете получить тип соединения с этим классом.

/** * Проверьте сетевое подключение устройства и скорость * @author Max https://stackoverflow.com/users/801646/max * */общественного класса Connectivity {

/** 
* 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

извините, это не дает точного предела. –

+0

Это не * устанавливает * ограничение вообще, просто предоставляет различные фрагменты информации. – EJP

1

Если у вас Socket вы может просто установить размер принимаемого буфера на желаемый продукт задержки полосы пропускания, но, как вы этого не сделаете, вам просто нужно будет спать между приемами. Эксперимент или какая-то арифметика с обратной связью даст соответствующие интервалы сна.

Смежные вопросы