編輯:關於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");
}
});
}
});
最終的效果如下圖所示
但是該庫只能獲得下載速度,上傳的速度無法獲得,使用的時候注意一下即可。
1、為什麼需要異步加載。因為我們都知道在Android中的是單線程模型,不允許其他的子線程來更新UI,只允許UI線程(主線程更新UI),否則會多個線程都去更新UI會造成U
想必現在有很多朋友都曾經遇到過這樣的困惑。小編也嘗試過修改幾個微信號都沒能成功;結果有一個是兩年前注冊的微信號,並且當時是已經填寫了自己的微信號(不是默認號
背景故事:4月份從公司回到學校,要開始著手做大四的畢業設計。然而畢設的其中一個功能模塊便是——心情分享模塊,在記錄心情的同時可以把心情分享到朋友圈
ContentProvider:內容提供者ContentProvider簡介:當應用繼承ContentProvider類,並重寫該類用於提供數據和存儲數據的方法,就可以向