限制下载带宽

3
我有一个应用程序,可以利用互联网连接下载数据。我正在使用HttpURLConnection完成此操作。 问题:我的应用会耗尽互联网带宽,因此用户使用浏览器时会变慢。 我想让他们自行选择设置带宽限制,而不像这个网站那样。我已经了解过这个了。 问题:如何在下载时设置带宽限制?例如: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) {}
        }
    }
}
2个回答

1
如果你有一个Socket,你可以将接收缓冲区大小设置为所需的带宽延迟乘积,但是由于你没有,你只能在接收调用之间进行睡眠。实验或一些反馈基础的算术将产生适当的睡眠间隔。

-1

您可以在设置活动中设置首选项,例如使用移动数据/ Wi-Fi / 漫游下载。您可以使用此类获取连接类型。

/** * Check device's network connectivity and speed * @author Max https://stackoverflow.com/users/801646/max * */ public class 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;
    }
}

}


抱歉,它没有给出确切的限制。 - Anggrayudi H
这并没有限制任何内容,只是提供了各种信息片段。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接