我的应用程序试图计算通过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中发送和接收的正确字节数?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)