gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:00:30 27 4
gpt4 key购买 nike

我的应用正在尝试计算通过 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;

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

有没有办法让我检查 TrafficStats 是如何得出这些数字的?我知道除了我的浏览器之外,可能还有其他应用程序在后台运行并连接到互联网,但 2.7MB 到 10MB 似乎是一个巨大的跳跃——我什至有一次什么都没做就“收到”90MB。还是我计算发送和接收的字节数的方式有问题?

最佳答案

来自 TechRepublic :

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

  2. /res/layout 文件夹中,我们将创建一个 activity_main.xml 资源。对于这个项目,我们只是在垂直方向上使用一系列 TextView 堆叠线性布局。

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 类。让我们也继续前进声明三个私有(private)类变量。

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 覆盖来初始化我们的私有(private)变量,以及在 UI 线程上安排回调。做一个请注意检查枚举 TrafficStats.UNSUPPORTED。而我的使用 TrafficStats 类的体验一直很顺利,谷歌官方文档声明某些设备可能不支持这种类型的报告,如果是这种情况,调用会返回前述值。出于这个原因,写你的是个好主意防御性编码,正如我在此处演示的那样。

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);
}
};

关于android - 如何在 TrafficStats 中获取正确的发送和接收字节数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12765562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com