前言#
昨天發生了一點小插曲,首次使用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,是不是非常的簡單,又了解了一個新的框架,以后遇到這種跟網絡有關的需求,就不用蛋疼了。
下班了,拜拜。