Android 获取当前网速
来源:互联网 发布:汉语言文学专业 知乎 编辑:程序博客网 时间:2024/05/20 11:48
问题描述:
- 当前网络视频播放应用盛行,很多时候大家都可以看到在视频缓冲时会显示一个网络的速度,或者在InforBar上会有当前网络速度的显示,这是一个很好的用户体验。但是很多工程师并不知道如何去实现这一个功能, 今天我就给大家分享一下刚刚完成的,还是热乎乎的代码。
思路:
- 编程最重要的是要有思路。本问题的思路就是 :
- android系统带有相关的API。
- 根据获取当前时间总流量, 然后用当前总流量-前一秒总流量=当前网速。
- 创建定时器,定时跟新你的网速。达到完美的体验效果。
具体代码
- 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(); }}
阅读全文
1 0
- Android 获取当前网速
- Android 获取当前网速质量调整网络请求
- Android 获取当前网速质量调整网络请求
- Android获取当前网速质量——分四个等级
- android 获取网速
- android 获取网速2
- android 获取手机网速
- 用Linux C语言获取当前网速
- 线程获取当前网速的方式
- 获取android的实时网速
- Android获取网速的方法
- Android获取网速和下载速度
- Android获取网速和下载速度
- Android_检测当前网速
- Android获取当前桌面壁纸
- android获取当前ip
- Android获取当前桌面壁纸
- Android获取当前时间
- 两分钟学会电子元器件焊接技术!
- 线性查找
- Eclipse-adb指令
- GitLab使用总结
- 通过代理安装pip,及scrapy安装报错记录
- Android 获取当前网速
- 编写可维护的javascript(六):避免使用全局变量
- matlab中的正则表达式
- hadoop集群搭建
- 关于移动端rem适配问题
- 结构体中特殊定义int a:5
- CVPR 2017最佳论文解读:密集连接卷积网络DenseNet
- HDU
- hibernate动态表名