代码编织梦想

效果图

最近在项目开发中遇到了一项功能,需要在下载文件时显示出当前的网络速度和预计剩余时间,在调研中发现使用的比较多的是通过TrafficStats来获取网络使用量然后在间隔每秒后重新获取一次网络使用量,两者相机算既可以得出每秒的网络使用量。


public class FlowStats {

    private long lastTotalRxBytes;
    private long lastTimeStamp;

    public String getNetSpeedToMB(Context context){
        String netSpeed;
        long speed = absKb(context);
        if (speed == 0){
            return "0 MB/s";
        }
        netSpeed = String.format("%.2f", new Float(speed / 1024f)) + " MB/s";
        return netSpeed;
    }

    public String getNetSpeedToKB(Context context){
        String netSpeed;
        long speed = absKb(context);
        netSpeed = speed + " KB/s";
        return netSpeed;
    }

    private long absKb(Context context){
        try{
            long nowTotalRxBytes = TrafficStats.getTotalRxBytes() / 1024; // kb
            long nowTimeStamp = System.currentTimeMillis();
            long speed = (nowTotalRxBytes - lastTotalRxBytes) * 1000 / (nowTimeStamp - lastTimeStamp);
            lastTotalRxBytes = nowTotalRxBytes;
            lastTimeStamp = nowTimeStamp;
            return speed;
        }catch (Exception e){
            System.out.println(e.getMessage());
            return 0;
        }

    }
}

这种方案虽然可以得到结果,但获取的是总量,其中也包含了非本应用的使用量,这样计算出的结果是没法用的。其次可以只获取本应用的使用量,但这样获取出的结果无法精确到单个文件的速度所以也没法直接使用。

最优方案:

		byte[] buffer = new byte[1024*4];
        int len;
		long beforeTime = System.currentTimeMillis(); // 前一秒
        long secondCount = 0; // 每秒的下载量
        while ((len = inputStream.read(buffer)) != -1) {
//            计算每秒的下载量并进行回调
            long currentTime = System.currentTimeMillis();
            if (currentTime - beforeTime > 1000){
                beforeTime = currentTime;
                info.setSecondCount(secondCount);
                secondCount = 0;
                HttpDownloadManager.getInstance().notifyDownloadProgressed(info);
            }else {
                secondCount += len;
            }
        }

上面是通过在读取文件流时按每秒中读取的量来回调给观察者 下面在看观察者收到回调后的处理

    @Override
    public void onDownloadProgressed(DownLoadInfo info) {
        this.downLoadInfo = info;
        long secondCount = info.getSecondCount();
        float m = secondCount / 1024f / 1024f;
        int surplus = (int) ((info.getCountLength() - info.getReadLength()) / secondCount);
        setText(String.format("%.1f", m) + "MB/s 剩余时间" + surplus + "秒 已下载 " + info.getPercentage() + "%");
    }

呈现效果
效果图

Demo地址:netSpeedDemo

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/qq_35624842/article/details/111040677

网络配置实训(思科)-爱代码爱编程

一、网络系统工程方案设计 以XXX为背景,了解文华学院现有校园网络的构成。主要从网速提高,网络安全,无线网络构建等几个方面进行分析,并提出合理的改进意见,设计出更优的校园网络工程方案。 1、需求分析 以文华学院为背景,通过实地调查、现场访谈、书面调查等形式了解文华学院的组织结构、网络建设的背景,对文华学院的网络工程有一个全面的感性的认识。建设文华学院需要重

[HITCN]哈工大2020秋计算机网络复习笔记 (8)-爱代码爱编程

文章目录 4 网络层4.9 路由算法4.9.1 链路状态路由算法4.9.2 距离向量路由算法4.8.3 层次路由4.8.4 Internet路由4.8.4.1 RIP4.8.4.2 OSPF4.8.4.3 BGP 4 网络层 4.9 路由算法 网络抽象:图G = (N, E),N = 路由器集合,E = 链路集合 费用(Costs):每段

亲测可用小米刷旧版开发版固件,刷入华硕、潘多拉固件-爱代码爱编程

准备 小米路由器青春版 *1、网线 *1、电脑 *1 准备文件:小米路由器青春版刷机.zip 最主要的还是小米路由器青春版的老版开发版固件 刷入开发版ROM 解压提供的压缩包 登录你的小米路由器(192.168.31.1) 然后选择升级系统、手动升级选择“miwifi_r1cl_all_59371_2.1.26.bin” 修改SSH密码 登录

4G&5G学习过程中整理的专业名词的符号简称-爱代码爱编程

-写这个文章的初衷 最近开始接触无线网络方面的知识,一开始看资料对于简称完全懵,每次遇到都要去百度,所以就整理了遇到过的专业名词简称。 - 专业名词符号 1.GSM:全球移动通信系统 主要包括MS(移动用户),BSS(基站子系统),NSS(网络与交换子系统)以及OSS(操作维护子系统) MS:用户所有信息都储存在SIM卡上 BSS:包括了发信机(BTC

生成树算法STA-爱代码爱编程

目录 一、背景 二、生成树算法介绍 三、生成树协议特点 四、生成树算法详细过程 五、例题 六、参考教程 一、背景 由于网络中会存在单点故障而导致网络无法访问,系统瘫痪,因此在网络中提供冗余链路即引入备份链路来提高网络的健壮性、稳定性。常见的冗余方式有:链路冗余和设备冗余。好处是,减少单点故障,增加网络可靠性;坏处是,产生交换环路,会导致广播

腾讯T1~T9级别工程师分别需要具备哪些能力你知道吗?-爱代码爱编程

前言 2020年秋招已经结束了,很多没拿到满意offer的同学已经在备战2021年春招了。腾讯在国内无论是知名度还是体量都是当之无愧的的巨无霸,本身也是很多朋友的目标,就跟清北之于高考生一样,先不说能不能考上,但没有考生是不向往的。 而且鲁迅说过刚毕业的程序员能进BAT这等大厂是最好的,因为不论是技术体系、职业规划和发展前途都不是小公司能比拟的。只是该

程序员深度学习!渣本毕业两年经验,面试心得体会-爱代码爱编程

前言 回顾一下自己这段时间的经历,因公司突然通知裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷。公司开始第二波裁员,我决定主动拿赔偿走人。后续的面试过程我做了一些准备,基本都能走到hr面,后面我也顺利地拿到了offer,我给大家分享下我的求职体会,希望能给大家一些参考。 1.【字节跳动全套高级学习资料】九大专题:

关于Activity活动知识的简单概述-爱代码爱编程

这里的知识都是对《第一行代码》的总结 活动的状态(4种) 每个活动在其生命周期中最多可能会有四种状态1.运行状态 2.暂停状态 3.停止状态 4.销毁状态 运行状态:活动处于返回栈的栈顶 暂停状态:活动不在栈顶但仍然可见 停止状态:活动不在栈顶并且完全不可见 销毁状态:活动从返回栈中移除 活动的生命周期(7个)1:onCreate() 2:onSta

程序员必学!2021年Android工作或许更难找,已拿offer-爱代码爱编程

开头 通常作为一个Android APP开发者,我们并不关心Android的源代码实现,不过随着Android开发者越来越多,企业在筛选Android程序员时越来越看中一个程序员对于Android底层的理解和思考,这里的底层主要就是Android Framewok中各个组件的运行原理,例如Binder的运行机制、ServiceManager的作用等等。

腾讯T2大牛手把手教你!Android开发者跳槽指南持续更新中-爱代码爱编程

前言 回顾一下自己这段时间的经历,因公司突然通知裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷。公司开始第二波裁员,我决定主动拿赔偿走人。后续的面试过程我做了一些准备,基本都能走到hr面,后面我也顺利地拿到了offer,我给大家分享下我的求职体会,希望能给大家一些参考。 【阿里P7级全套高级学习资料】五大专题: 1.

gradle applicationId应用 ID ,包名(清单文件中 package) 说明-爱代码爱编程

gradle 设置应用 ID,包名说明 参考:设置应用 ID 小结: pagename包名与 生成的R文件,文件目录有关联。如果有子软件包,但是这些文件必须从 package 属性导入使用命名空间的 R.java 类,而且清单中声明的任何应用组件都必须添加缺失的子软件包名称(或者使用完全限定软件包名称)。打包完成后,applicationId 会

腾讯T2大牛手把手教你!抖音四面被拒,再战头条终获offer,醍醐灌顶!-爱代码爱编程

前言 Hi~,我是 2020 届物联网专业毕业生,现就读于杭州。谨以此文来记录我的秋招以及入门前端以来的学习历程,如有错误,希望大家能及时提出! 面试情况 前前后后一共面试了 14 家公司的前端岗,按城市划分为: 北京:小米,京东,美团,百度,去哪儿杭州:阿里,网易,微店,字节跳动上海:七牛云,哈啰出行深圳:腾讯,富途,乐信历时4个月,最