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

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

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

我觉得上面的algorithm是合理的,但是,我不确定如何检查这些计数器的准确性。 例如,当我尝试通过WiFi向Dropbox上传一个2.7MB的文件时,我得到的当前currentMobileSent值大约是10MB。 甚至在下一次检查之前,即使没有浏览网页,我也会得到非零值,表示在等待期间我确实收到了一些字节的数据。

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

Related of "如何获取在TrafficStats中发送和接收的正确字节数?"

来自TechRepublic :

  1. 在Eclipse中创build一个新的Android项目。 请记住使用TrafficStats类,您必须将Android 2.2(Froyo)或更高版本的API作为目标。

  2. /res/layout文件夹中,我们将创build一个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文件夹。 通过扩展Activity / AppCompatActivity类来创buildMainActivity.java。 我们还要继续并声明三个私有类variables。

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创build重写初始化我们的私有variables,以及在UI线程上安排一个callback。 记下对枚举TrafficStats.UNSUPPORTED的检查。 虽然我对TrafficStats类的使用经验并不困难,但官方Google文档指出,有些设备可能不支持这种types的报告,并且在这种情况下,调用返回上述值。 出于这个原因,如我在这里演示的那样,防御性地编写代码是一个好主意。

MainActivity.java

 @Override public 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); } };