下载时限制带宽

时间:2014-12-05 14:16:43

标签: java android download httpurlconnection

我有一个可以使用互联网连接下载数据的应用。我使用HttpURLConnection来做到这一点。

问题:我的应用消耗了互联网带宽,因此用户将在浏览器上慢慢浏览。我想让他们自己设置带宽限制,而不是this site。我已经知道了。

问题:如何在下载时设置带宽限制?例如:500 KB / s(每秒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) {}
        }
    }
}

2 个答案:

答案 0 :(得分:1)

如果您有一个Socket,您可以将接收缓冲区大小设置为所需的带宽延迟产品,但是,您不必在接收呼叫之间休眠。实验或一些基于反馈的算法将产生适当的睡眠间隔。

答案 1 :(得分:-1)

您可以在设置活动中使用移动数据/ Wifi /漫游中的下载等首选项。您可以使用此类获取连接类型。

  

/ ** *检查设备的网络连接和速度* @author Max   https://stackoverflow.com/users/801646/max * * /公共课   连通性{

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

}