Android 获取当前网速质量调整网络请求

在开发中,有时候常常需要根据用户当前的网速来做一些操作,比如图片的加载,当网速非常好的时候,比如连接的是wifi,我们就会下载高分辨率的图片,反之,当用户使用的是2g网时,我们则给他下载低分辨率的小图,从而节省用户流量。

而Facebook其实已经给我们提供了这么一个库,详见network-connection-class

使用其实超级简单,先加入依赖

compile ‘com.facebook.network.connectionclass:connectionclass:1.0.1‘

在该库中,我们使用的主要是ConnectionClassManager这个类,这个类中有几个主要的方法。

  • getCurrentBandwidthQuality() 获得当前网速的质量,是一个枚举类型。
public enum ConnectionQuality {
  /**
   * Bandwidth under 150 kbps.
   */
  POOR,
  /**
   * Bandwidth between 150 and 550 kbps.
   */
  MODERATE,
  /**
   * Bandwidth between 550 and 2000 kbps.
   */
  GOOD,
  /**
   * EXCELLENT - Bandwidth over 2000 kbps.
   */
  EXCELLENT,
  /**
   * Placeholder for unknown bandwidth. This is the initial value and will stay at this value
   * if a bandwidth cannot be accurately found.
   */
  UNKNOWN
}
  • getDownloadKBitsPerSecond() 获得每秒的下载速度

此外,我们可以获得网络质量发生改变时的通知,比如从POOR变成了GOOD,我们只要注册监听器即可,这是一个观察者模式。

private ConnectionChangedListener listener = new ConnectionChangedListener();

private class ConnectionChangedListener implements
        ConnectionClassManager.ConnectionClassStateChangeListener {
    @Override
    public void onBandwidthStateChange(ConnectionQuality bandwidthState) {
        Log.e("onBandwidthStateChange", bandwidthState.toString());
    }
}

我们在Activity的onResume中注册监听器,在onPause中取消注册

    @Override
    protected void onResume() {
        super.onResume();
        ConnectionClassManager.getInstance().register(listener);
    }

    @Override
    protected void onPause() {
        super.onPause();
        ConnectionClassManager.getInstance().remove(listener);
    }

之后,在网络请求之前,我们需要调用开始采样的方法

 DeviceBandwidthSampler.getInstance().startSampling();

网络请求完成后,结束采样

DeviceBandwidthSampler.getInstance().stopSampling();

假设我们使用的是OkHttp

OkHttpClient client = new OkHttpClient();
                Request.Builder builder = new Request.Builder();
                Request request = builder.url("http://www.baidu.com").build();

                DeviceBandwidthSampler.getInstance().startSampling();
                client.newCall(request).enqueue(new Callback() {
                    @Override
                    public void onFailure(Call call, IOException e) {
                        DeviceBandwidthSampler.getInstance().stopSampling();
                        Log.e("TAG","onFailure:"+e);
                    }

                    @Override
                    public void onResponse(Call call, Response response) throws IOException {
                        DeviceBandwidthSampler.getInstance().stopSampling();
                        Log.e("TAG","onResponse:"+response);
                        final ConnectionQuality connectionQuality = ConnectionClassManager.getInstance().getCurrentBandwidthQuality();
                        final double downloadKBitsPerSecond = ConnectionClassManager.getInstance().getDownloadKBitsPerSecond();
                        Log.e("TAG","connectionQuality:"+connectionQuality+" downloadKBitsPerSecond:"+downloadKBitsPerSecond+" kb/s");

                        tv.post(new Runnable() {
                            @Override
                            public void run() {
                                tv.setText("connectionQuality:"+connectionQuality+"\n"+"downloadKBitsPerSecond:"+downloadKBitsPerSecond+" kb/s");
                            }
                        });
                    }
                });

最终的效果如下图所示

但是该库只能获得下载速度,上传的速度无法获得,使用的时候注意一下即可。

源码下载

http://download.csdn.net/detail/sbsujjbcy/9438965

时间: 2024-10-19 17:06:23

Android 获取当前网速质量调整网络请求的相关文章

TrafficStats——流量统计类的范例,获取实时网速

2.3开始android就提供来这个类的API,这样我们就可以方便的用他来实现统计手机流量来.这个类其实也很简单,我贴上他的几个方法,大家一看就知道怎么用了. static long getMobileRxBytes() //获取通过Mobile连接收到的字节总数,不包含WiFistatic long getMobileRxPackets() //获取Mobile连接收到的数据包总数static long getMobileTxBytes() //Mobile发送的总字节数static long

Android获取外网和内网的IP

很晚了,直播上代码: /** * 获取外网的IP(要访问Url,要放到后台线程里处理) * * @Title: GetNetIp * @Description: * @param @return * @return String * @throws */ public static String GetNetIp() { URL infoUrl = null; InputStream inStream = null; String ipLine = ""; HttpURLConnect

Android 获取外网IP,实测有效

网上有很多获取IP的例子,不过都是获取到的本地ip,还有的是因为走不通了,获取到的ip为空,下面看实测获取到外网IP的代码,注意需要在线程里面执行 /** * 获取外网的IP(要访问Url,要放到后台线程里处理) * * @param @return * @return String * @throws * @Title: GetNetIp * @Description: */ public static String getNetIp() { URL infoUrl = null; Input

ruby on rails 网页上如何实时显示服务器网速?

要在网页上实时显示网速,需要实时请求服务器(由于许多浏览器不支持web socket,这里还是用ajax轮询的方式),这里的服务器以centos为例,使用sysstat,不同的服务器,可能需要不同的软件支持. 一.centos里安装sysstat yum  install sysstat 安装完成后,使用sar -V查看 二.sar的使用 首先使用ifconfig查看使用的网上,确认一个要查看的网卡的名称,这里我使用的是eth0 然后使用sar获取网速: sar -n DEV 1 1 | gre

如何限制网速?怎么控制流量?

如何设置局域网网速大小? 网络协议占用带宽越来越多,限速功能也成为很多网络设备,网络软件的火热功能,但是限速到底能不能提高局域网网络带宽整体使用,这个也是仁者见仁智者见智了.详见"网络带宽资源优化" 因为限速功能涉及局域网整体流量,所以,限速的设备一定是要串联在网络里面才可以稳定,安全的实现,最常见的就是路由,但是很多路由的限速功能做的比较粗略,并没有达到让局域网设备限速的效果,本文介绍的Wfilter上网行为管理的限速功能可以参考(PS,Wfilter上网行为管理系统的免费版也有这个

基于Retrofit+RxJava的Android分层网络请求框架

目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及数据传输安全性高等特点. Retrofit源码更是经典的设计模式教程,笔者已在之前的文章中分享过自己的一些体会,有兴趣的话可点击以下链接了解:<Retrofit源码设计模式解析(上)>.<Retrofit源码设计模式解析(下)> 但在具体业务场景下,比如涉及到多种网络请求(GET/PU

(转载)Android之三种网络请求解析数据(最佳案例)

[置顶] Android之三种网络请求解析数据(最佳案例) 2016-07-25 18:02 4725人阅读 评论(0) 收藏 举报  分类: Gson.Gson解析(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 小武:相信大家都用过网络请求解析数据,只是方法不一样而已,但是,逻辑都是差不多的: 一:AsyncTask解析数据 AsyncTask主要用来更新UI线程,比较耗时的操作可以在AsyncTask中使用. AsyncTask是个抽象类,使用时需要继承这个

《android开发进阶从小工到专家》读书笔记--HTTP网络请求

No1: 客户端与服务器的交互流程: 1)客户端执行网络请求,从URL中解析出服务器的主机名 2)将服务器的主机名转换成服务器的IP地址 3)将端口号从URL中解析出来 4)建立一条从客户端与Web服务器的TCP连接 5)客户端通过输出流向服务器发送一条HTTP请求 6)服务器向客户端回送一条HTTP响应报文 7)客户端从输入流获取报文 8)客户端解析报文,关闭连接 9)客户端将结果显示在UI上 No2: HTTP请求方式: 1)GET 获取服务器中某个资源,www.devtf.cn/artic

Android获取网速和下载速度

Android应用里经常使用到网络速度的显示,特别是文件下载和视频缓冲的时候.今天笔者就遇到需要显示视频播放时的网速,用到的是TrafficStats类. 查找资料,参考了Android流量统计TrafficStats类的使用 private void showNetSpeed() { long nowTotalRxBytes = getTotalRxBytes(); long nowTimeStamp = System.currentTimeMillis(); long speed = ((n