问题描述:
- 当前网络视频播放应用盛行,很多时候大家都可以看到在视频缓冲时会显示一个网络的速度,或者在InforBar上会有当前网络速度的显示,这是一个很好的用户体验。但是很多工程师并不知道如何去实现这一个功能, 今天我就给大家分享一下刚刚完成的,还是热乎乎的代码。
思路:
- 编程最重要的是要有思路。本问题的思路就是 :
- android系统带有相关的API。
- 根据获取当前时间总流量, 然后用当前总流量-前一秒总流量=当前网速。
- 创建定时器,定时跟新你的网速。达到完美的体验效果。
具体代码
package com.example.atestvideospeed;
import android.net.TrafficStats;
/**
* <p>
* <code>lastTotalRxBytes = getTotalRxBytes();<br>
* lastTimeStamp = System.currentTimeMillis();<br>
* new Timer().schedule(task, 1000, 2000); // 1s后启动任务,每2s执行一次<br>
* TimerTask task = new TimerTask();
*/
public class NetSpeed {
private static final String TAG = NetSpeed.class.getSimpleName();
private long lastTotalRxBytes = 0;
private long lastTimeStamp = 0;
public String getNetSpeed(int uid) {
long nowTotalRxBytes = getTotalRxBytes(uid);
long nowTimeStamp = System.currentTimeMillis();
long speed = ((nowTotalRxBytes - lastTotalRxBytes) * 1000 / (nowTimeStamp - lastTimeStamp));
lastTimeStamp = nowTimeStamp;
lastTotalRxBytes = nowTotalRxBytes;
return String.valueOf(speed) + " kb/s";
}
public long getTotalRxBytes(int uid) {
return TrafficStats.getUidRxBytes(uid) == TrafficStats.UNSUPPORTED ? 0 : (TrafficStats.getTotalRxBytes() / 1024);
}
}
package com.example.atestvideospeed;
import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
public class NetSpeedTimer {
private long defaultDelay = 1000;
private long defaultPeriod = 1000;
private static final int ERROR_CODE = -101011010;
private int mMsgWhat = ERROR_CODE;
private NetSpeed mNetSpeed;
private Handler mHandler;
private Context mContext;
private SpeedTimerTask mSpeedTimerTask;
public static final int NET_SPEED_TIMER_DEFAULT = 101010;
public NetSpeedTimer(Context context, NetSpeed netSpeed, Handler handler) {
this.mContext = context;
this.mNetSpeed = netSpeed;
this.mHandler = handler;
}
public NetSpeedTimer setDelayTime(long delay) {
this.defaultDelay = delay;
return this;
}
public NetSpeedTimer setPeriodTime(long period) {
this.defaultPeriod = period;
return this;
}
public NetSpeedTimer setHanderWhat(int what) {
this.mMsgWhat = what;
return this;
}
/**
* 开启获取网速定时器
*/
public void startSpeedTimer() {
Timer timer = new Timer();
mSpeedTimerTask = new SpeedTimerTask(mContext, mNetSpeed, mHandler,
mMsgWhat);
timer.schedule(mSpeedTimerTask, defaultDelay, defaultPeriod);
}
/**
* 关闭定时器
*/
public void stopSpeedTimer() {
if (null != mSpeedTimerTask) {
mSpeedTimerTask.cancel();
}
}
/**
* @author
* 静态内部类
*/
private static class SpeedTimerTask extends TimerTask {
private int mMsgWhat;
private NetSpeed mNetSpeed;
private Handler mHandler;
private Context mContext;
public SpeedTimerTask(Context context, NetSpeed netSpeed,
Handler handler, int what) {
this.mContext = context;
this.mHandler = handler;
this.mNetSpeed = netSpeed;
this.mMsgWhat = what;
}
@Override
public void run() {
if (null != mNetSpeed && null != mHandler) {
Message obtainMessage = mHandler.obtainMessage();
if (mMsgWhat != ERROR_CODE) {
obtainMessage.what = mMsgWhat;
} else {
obtainMessage.what = NET_SPEED_TIMER_DEFAULT;
}
obtainMessage.obj = mNetSpeed.getNetSpeed(mContext
.getApplicationInfo().uid);
mHandler.sendMessage(obtainMessage);
}
}
}
}
package com.example.atestvideospeed;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Handler.Callback;
import android.os.Message;
import android.util.Log;
public class MainActivity extends Activity implements Callback{
private static final String TAG = MainActivity.class.getSimpleName();
private NetSpeedTimer mNetSpeedTimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Handler handler = new Handler(this);
mNetSpeedTimer = new NetSpeedTimer(this, new NetSpeed(), handler).setDelayTime(1000).setPeriodTime(2000);
mNetSpeedTimer.startSpeedTimer();
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case NetSpeedTimer.NET_SPEED_TIMER_DEFAULT:
String speed = (String)msg.obj;
Log.i(TAG, "current net speed = " + speed);
break;
default:
break;
}
return false;
}
@Override
protected void onDestroy() {
if(null != mNetSpeedTimer){
mNetSpeedTimer.stopSpeedTimer();
}
super.onDestroy();
}
}