android– 如何获取TrafficStats中发送和接收的正确字节数?

android– 如何获取TrafficStats中发送和接收的正确字节数?,第1张

概述我的应用程序试图计算通过WiFi/LAN和移动数据连接发送和接收字节数.为此,我在一个时间点获取TrafficStats计数器的值,并在下次检查时从其值中减去该值.//getcurrentvaluesofcounterslongcurrentMobileTxBytes=TrafficStats.getMobileTxBytes();longcurrentMobileR

我的应用程序试图计算通过WiFi / LAN和移动数据连接发送和接收的字节数.为此,我在一个时间点获取TrafficStats计数器的值,并在下次检查时从其值中减去该值.

// get current values of counterslong currentMobileTxBytes = TrafficStats.getMobileTxBytes();long currentMobileRxBytes = TrafficStats.getMobileRxBytes();long totalTxBytes = TrafficStats.getTotalTxBytes();long totalRxBytes = TrafficStats.getTotalRxBytes();// to get mobile data count, subtract old from currentlong currentMobileSent = currentMobileTxBytes - oldMobileTxBytes;long currentMobileReceived = currentMobileRxBytes - oldMobileRxBytes;// to get WiFi/LAN data count, subtract total from mobilelong currentNetworkSent = totalTxBytes - currentMobileTxBytes;long currentNetworkReceived = totalRxBytes - currentMobileRxBytes;

我觉得上面的算法是合理的,但是,我不知道如何检查这些计数器的准确性.例如,当我尝试通过WiFi将2.7MB文件上传到DropBox时,我得到的currentMobileSent值大约是10MB.即使没有浏览网页直到下一次检查,我得到非零值,表明我在等待期间确实收到了一些字节数据.

有没有办法让我检查TrafficStats如何到达这些数字?我知道除了我的浏览器,可能还有其他应用程序在后台运行连接到互联网,但2.7MB到10MB似乎是一个巨大的跳跃 – 我甚至“没有做任何事情”一次“收到”90MB.或者我计算发送和接收的字节的方式有问题吗?

解决方法:

从TechRepublic开始:

>在Eclipse中创建一个新的AndroID项目.请记住使用TrafficStats类,您必须针对AndroID 2.2(Froyo)或
更高.
>在/ res / layout文件夹中,我们将创建一个activity_main.xml资源.对于这个项目,我们只是垂直使用一系列文本视图
堆叠线性布局.

activity_main.xml中

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"   androID:layout_wIDth="fill_parent"   androID:layout_height="fill_parent"   androID:orIEntation="vertical">   <TextVIEw       androID:layout_wIDth="fill_parent"       androID:layout_height="wrap_content"       androID:gravity="center"       androID:paddingBottom="20dip"       androID:text="Traffic Stats Demo"       androID:textSize="16sp"       androID:textStyle="bold" />   <TextVIEw       androID:layout_wIDth="fill_parent"       androID:layout_height="wrap_content"       androID:gravity="center"       androID:text="Transmit Bytes"       androID:textcolor="#00ff00"       androID:textSize="14sp" />   <TextVIEw       androID:ID="@+ID/TX"       androID:layout_wIDth="fill_parent"       androID:layout_height="wrap_content"       androID:gravity="center"       androID:text="0"       androID:textSize="14sp" />   <TextVIEw       androID:layout_wIDth="fill_parent"       androID:layout_height="wrap_content"       androID:gravity="center"       androID:text="Receive Bytes"       androID:textcolor="#ff0000"       androID:textSize="14sp" />   <TextVIEw       androID:ID="@+ID/RX"       androID:layout_wIDth="fill_parent"       androID:layout_height="wrap_content"       androID:gravity="center"       androID:text="0"       androID:textSize="14sp" /></linearLayout>

在我们的布局到位后,我们可以转到/ src文件夹.创造
MainActivity.java通过扩展Activity / AppCompatActivity类.我们也继续吧
声明三个私有类变量.

MainActivity.java

package com.authorwjf;import androID.app.Activity;import androID.app.AlertDialog;import androID.net.TrafficStats;import androID.os.Bundle;import androID.os.Handler;import androID.Widget.TextVIEw;public class Main extends Activity {    private Handler mHandler = new Handler();    private long mStartRX = 0;    private long mStartTX = 0;}

我们将使用on create overrIDe初始化我们的私有
变量,以及在UI线程上安排回调.做一个
注意检查枚举TrafficStats.UNSUPPORTED.虽然我的
使用TrafficStats类的经验一直没有问题
官方Google文档指出某些设备可能不支持
这种类型的报告,在这种情况下,呼叫返回
上述价值.出于这个原因,写你的是一个好主意
正如我在这里所展示的那样,防御性的代码.

MainActivity.java

@OverrIDepublic voID onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentVIEw(R.layout.activity_main);    mStartRX = TrafficStats.getTotalRxBytes();    mStartTX = TrafficStats.getTotalTxBytes();    if (mStartRX == TrafficStats.UNSUPPORTED || mStartTX == TrafficStats.UNSUPPORTED) {        AlertDialog.Builder alert = new AlertDialog.Builder(this);        alert.setTitle("Uh Oh!");        alert.setMessage("Your device does not support traffic stat monitoring.");        alert.show();    } else {        mHandler.postDelayed(mRunnable, 1000);    }}

最后但并非最不重要的是,我们需要更新我们的显示并重新安排
可运行.

MainActivity.java

private final Runnable mRunnable = new Runnable() {    public voID run() {        TextVIEw RX = (TextVIEw) findVIEwByID(R.ID.RX);        TextVIEw TX = (TextVIEw) findVIEwByID(R.ID.TX);        long rxBytes = TrafficStats.getTotalRxBytes() - mStartRX;        RX.setText(Long.toString(rxBytes));        long txBytes = TrafficStats.getTotalTxBytes() - mStartTX;        TX.setText(Long.toString(txBytes));        mHandler.postDelayed(mRunnable, 1000);    }};
总结

以上是内存溢出为你收集整理的android – 如何获取TrafficStats中发送和接收的正确字节数?全部内容,希望文章能够帮你解决android – 如何获取TrafficStats中发送和接收的正确字节数?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1100603.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存