gpt4 book ai didi

android - 有人可以解释一下 TrafficStats 如何在 Android 操作系统中发挥其魔力吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:29:46 25 4
gpt4 key购买 nike

我写了一个不错的小 Android 应用程序来检查数据使用情况,不幸的是它严重依赖于 Froyo (Android 2.2) 引入的 android.net.TrafficStats。

我正在尝试为我的非 Froyo 用户反向移植此类,以及我能够从 Android source 中确定的内容是:

  1. TrafficStats.java 只是指向 c 文件的 native 指针
  2. c 文件打开两个文件(见下文)并读取它们的内容
  3. 如果其中一个包含数值,它会将其吐回作为“使用的字节数”计数

这是我的挑战...当我通过设备上的 API 调用 TrafficStats 时,我得到了一个读数(例如 1113853 字节)。当我打开这两个文件并检查它们的内容时,一个文件不存在,另一个文件是 0 字节。

很明显,我误解了 TrafficStats 的作用。任何人都可以阐明它是如何工作的吗?

感谢您的帮助。

(这是我尝试将 c 文件移植到 java)

package com.suttco.net;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import com.suttco.IOUtils;
import com.suttco.StringUtils;

import android.util.Log;

public class TrafficStatsFile {

private static final String mobileRxFile_1 = "/sys/class/net/rmnet0/statistics/rx_bytes";
private static final String mobileRxFile_2 = "/sys/class/net/ppp0/statistics/rx_bytes";
private static final String mobileTxFile_1 = "/sys/class/net/rmnet0/statistics/tx_bytes";
private static final String mobileTxFile_2 = "/sys/class/net/ppp0/statistics/tx_bytes";

private static final String LOGGING_TAG = TrafficStatsFile.class.getSimpleName();

public long getMobileRxBytes() {
return tryBoth(mobileRxFile_1, mobileRxFile_2);
}

public long getMobileTxBytes() {
return tryBoth(mobileTxFile_1, mobileTxFile_2);
}

// Return the number from the first file which exists and contains data
private static long tryBoth(String a, String b) {
long num = readNumber(a);
return num >= 0 ? num : readNumber(b);
}

// Returns an ASCII decimal number read from the specified file, -1 on error.
private static long readNumber(String filename) {
File f = new File(filename);
if(f.exists()) {
if(f.canRead()) {
try {
Log.d(LOGGING_TAG, "f.length() = " + f.length());
String contents = IOUtils.readFileAsString(f);
if(StringUtils.IsNotNullOrEmpty(contents)) {
try {
return Long.parseLong(contents);
}
catch(NumberFormatException nfex) {
Log.w(LOGGING_TAG, "File contents are not numeric: " + filename);
}
}
else {
Log.w(LOGGING_TAG, "File contents are empty: " + filename);
}
}
catch (FileNotFoundException fnfex) {
Log.w(LOGGING_TAG, "File not found: " + filename, fnfex);
}
catch(IOException ioex) {
Log.w(LOGGING_TAG, "IOException: " + filename, ioex);
}
}
else {
Log.w(LOGGING_TAG, "Unable to read file: " + filename);
}
}
else {
Log.w(LOGGING_TAG, "File does not exist: " + filename);
}
return -1;
}
}

最佳答案

这是上面代码的一个有效的修改版本。这个正在使用 RandomAccessFile 并且不依赖于自定义 imports 但仅使用内置的 String 函数及其 Exceptions.

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

import android.util.Log;

public class TrafficStatsFile {

private static final String mobileRxFile_1 = "/sys/class/net/rmnet0/statistics/rx_bytes";
private static final String mobileRxFile_2 = "/sys/class/net/ppp0/statistics/rx_bytes";
private static final String mobileTxFile_1 = "/sys/class/net/rmnet0/statistics/tx_bytes";
private static final String mobileTxFile_2 = "/sys/class/net/ppp0/statistics/tx_bytes";

private static final String LOGGING_TAG = TrafficStatsFile.class.getSimpleName();

public long getMobileRxBytes() {
return tryBoth(mobileRxFile_1, mobileRxFile_2);
}

public long getMobileTxBytes() {
return tryBoth(mobileTxFile_1, mobileTxFile_2);
}

// Return the number from the first file which exists and contains data
private static long tryBoth(String a, String b) {
long num = readNumber(a);
return num >= 0 ? num : readNumber(b);
}

// Returns an ASCII decimal number read from the specified file, -1 on error.
private static long readNumber(String filename) {
try {
RandomAccessFile f = new RandomAccessFile(filename, "r");
try {
Log.d(LOGGING_TAG, "f.length() = " + f.length());
String contents = f.readLine();
if(!contents.isEmpty() && contents!=null) {
try {
return Long.parseLong(contents);
}
catch(NumberFormatException nfex) {
Log.w(LOGGING_TAG, "File contents are not numeric: " + filename);
}
}
else {
Log.w(LOGGING_TAG, "File contents are empty: " + filename);
}
}
catch (FileNotFoundException fnfex) {
Log.w(LOGGING_TAG, "File not found: " + filename, fnfex);
}
catch(IOException ioex) {
Log.w(LOGGING_TAG, "IOException: " + filename, ioex);
}
}catch(FileNotFoundException ffe){
Log.w(LOGGING_TAG, "File not found: " + filename, ffe);
}
return -1;
}

}

关于android - 有人可以解释一下 TrafficStats 如何在 Android 操作系统中发挥其魔力吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4029186/

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