Android 获取当前网速

来源:互联网 发布:汉语言文学专业 知乎 编辑:程序博客网 时间:2024/05/20 11:48

问题描述:

- 当前网络视频播放应用盛行,很多时候大家都可以看到在视频缓冲时会显示一个网络的速度,或者在InforBar上会有当前网络速度的显示,这是一个很好的用户体验。但是很多工程师并不知道如何去实现这一个功能, 今天我就给大家分享一下刚刚完成的,还是热乎乎的代码。

思路:

- 编程最重要的是要有思路。本问题的思路就是 :

  1. android系统带有相关的API。
  2. 根据获取当前时间总流量, 然后用当前总流量-前一秒总流量=当前网速。
  3. 创建定时器,定时跟新你的网速。达到完美的体验效果。

具体代码

  • 1.获取网速类:
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";    }    //getApplicationInfo().uid    public long getTotalRxBytes(int uid) {        return TrafficStats.getUidRxBytes(uid) == TrafficStats.UNSUPPORTED ? 0 : (TrafficStats.getTotalRxBytes() / 1024);//转为KB    }}
  • 2 定时器类:
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() {            // TODO Auto-generated method stub            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);            }        }    }}
  • 3.调用显示类:
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);        //创建NetSpeedTimer实例        mNetSpeedTimer = new NetSpeedTimer(this, new NetSpeed(), handler).setDelayTime(1000).setPeriodTime(2000);        //在想要开始执行的地方调用该段代码        mNetSpeedTimer.startSpeedTimer();    }    @Override    public boolean handleMessage(Message msg) {        // TODO Auto-generated method stub        switch (msg.what) {        case NetSpeedTimer.NET_SPEED_TIMER_DEFAULT:            String speed = (String)msg.obj;            //打印你所需要的网速值,单位默认为kb/s            Log.i(TAG, "current net speed  = " + speed);            break;        default:            break;        }        return false;    }    @Override    protected void onDestroy() {        // TODO Auto-generated method stub        if(null != mNetSpeedTimer){            mNetSpeedTimer.stopSpeedTimer();        }        super.onDestroy();    }}
原创粉丝点击