在開(kāi)發(fā)中,有時(shí)候常常需要根據用戶(hù)當前的網(wǎng)速來(lái)做一些操作,比如圖片的加載,當網(wǎng)速非常好的時(shí)候,比如連接的是wifi,我們就會(huì )下載高分辨率的圖片,反之,當用戶(hù)使用的是2g網(wǎng)時(shí),我們則給他下載低分辨率的小圖,從而節省用戶(hù)流量。
而Facebook其實(shí)已經(jīng)給我們提供了這么一個(gè)庫,詳見(jiàn)network-connection-class。
使用其實(shí)超級簡(jiǎn)單,先加入依賴(lài)
compile ‘com.facebook.network.connectionclass:connectionclass:1.0.1‘在該庫中,我們使用的主要是ConnectionClassManager這個(gè)類(lèi),這個(gè)類(lèi)中有幾個(gè)主要的方法。
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}此外,我們可以獲得網(wǎng)絡(luò )質(zhì)量發(fā)生改變時(shí)的通知,比如從POOR變成了GOOD,我們只要注冊監聽(tīng)器即可,這是一個(gè)觀(guān)察者模式。
private ConnectionChangedListener listener = new ConnectionChangedListener();private class ConnectionChangedListener implements ConnectionClassManager.ConnectionClassStateChangeListener { @Override public void onBandwidthStateChange(ConnectionQuality bandwidthState) { Log.e("onBandwidthStateChange", bandwidthState.toString()); }}我們在A(yíng)ctivity的onResume中注冊監聽(tīng)器,在onPause中取消注冊
@Override protected void onResume() { super.onResume(); ConnectionClassManager.getInstance().register(listener); } @Override protected void onPause() { super.onPause(); ConnectionClassManager.getInstance().remove(listener); }之后,在網(wǎng)絡(luò )請求之前,我們需要調用開(kāi)始采樣的方法
DeviceBandwidthSampler.getInstance().startSampling();網(wǎng)絡(luò )請求完成后,結束采樣
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"); } }); } });最終的效果如下圖所示
但是該庫只能獲得下載速度,上傳的速度無(wú)法獲得,使用的時(shí)候注意一下即可。
源碼下載
聯(lián)系客服