前言#
昨天发生了一点小插曲,首次使用litepal(数据库框架)竟然没有建表,结果最后发现原因是:之前是afinal,版本号为1,现在使用litepal,如果数据库的名称一样,不提升版本号 是无法建表的,在这里也是提醒同样使用litepal的朋友,别跟我犯同样的错误。
这也是要临近下班的时间了,准备给大家推荐一款很使用的开源框架:Facebook开源的network-connection-class,检测手机的网络情况。
https://github.com/facebook/network-connection-class/
正文#
公司项目想要添加一个功能:根据用户手机的网速播放不同清晰度的视频。这个在现在的各大视频站实在是太常见了,根据网络情况自动匹配清晰度对应的视频,也可以让用户自己去切换,是个不错的用户体验。
要实现这样的功能首先要需要当前的网络情况才行,首先看看如何使用network-connection-class:
1、依赖compile 'com.facebook.network.connectionclass:connectionclass:1.0.1'
2、定义网络变化的监听Listener
public interface ConnectionClassStateChangeListener {
public void onBandwidthStateChange(ConnectionQuality bandwidthState);
}
其中bandwidthState就是当前的网络情况,在sdk中会把网速分为几个类型:
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
}
要注意的就是 UNKNOWN,注释已经写得很清楚, UNKNOWN是默认值直到没有精确的找到网络。
你也可以主动去查询当前的网络情况:
ConnectionQuality cq = ConnectionClassManager.getInstance().getCurrentBandwidthQuality();
3、设置监听的时机
ConnectionClassManager.getInstance().register(mListener);
跟广播类似,有注册就一定需要解绑,千万不要忘了。
4、开始采集网速和停止采集网速
DeviceBandwidthSampler.getInstance().startSampling();
// Do some downloading tasks
DeviceBandwidthSampler.getInstance().stopSampling();
注册了监听,并不会马上就能得到网络的情况,需要去开启采集,并且开启后去做一些网络操作,例如下载,在不需要采集手机网速的时候去关闭采集。掌握好恰当的时机,对于手机的消耗肯定是有好处的。
以我最开始的功能为例,我可以把需求分几个阶段:
1、先设置一个播放路径,等到有网速结果回调的时候立刻去设置对应的路径并seek到指定的位置。
2、如果网络变差,我可以提示用户是否要切换到低分辨率的视频。
3、等视频播放结束,关闭网速检测。
如果你有下载过什么,并且知道下载了多长,也可以直接去计算当前的网络情况:
ConnectionClassManager.addBandwidth(bandwidth, time);
如果网络有变化,会直接回调设置的listener。
总结#
ok,是不是非常的简单,又了解了一个新的框架,以后遇到这种跟网络有关的需求,就不用蛋疼了。
下班了,拜拜。