android4.4流量统计,android流量统计

这篇博客介绍了如何使用TrafficStats的getTotalTxBytes()方法来统计APP打开后的流量,并通过TimerTask和自定义Handler实现UI的定时更新,动态显示流量单位(B, KB, MB, GB)。博主分享了详细的代码实现,包括线程更新和消息处理的逻辑,适合需要进行流量统计和UI同步更新的开发者参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原始想法是按一个键,就进行一次页面跳转,之后开始统计流量次数,单位进行变化。

后面懒了直接打开app就能进行统计了,使用了TrafficStats的getTotalTxBytes()这个方法来获得打开app的总流量,app在后台运行时,自动计算,累加显示到TextView中。

关键是UI的更新,新建一个TimerTask,调用Timer的循环方法,定时获得流量数据,但是因为需要判断更新TextView,所以不能够在主线程启动一个UI线程,而数据又需要在UI线程中处理,果断写了一个MyHandler继承了Handler来进行消息处理。

线程更新:

private void initTimerTask() {

timerTask = new TimerTask() {

@Override

public void run() {

//获取现在最新的数据流量大小

current_data = TrafficStats.getTotalTxBytes();

double tp = current_data - start_data;

//除以次数,看单位转换

int count = 0;

//Log.v("data", "showDate :" + String.valueOf(tp));

while (tp > 1024) {

tp /= 1024;

count++;

if (count > 3)

break;

}

//不同的时候进行更新

if (showData != tp) {

showData = tp;

//新建一个message传递信息

Message msg = new Message();

msg.what = count;

Bundle bundle = new Bundle();

bundle.putDouble("showData", showData);

msg.setData(bundle);

updateUIHandler.sendMessage(msg);

}

Log.v("data", "count :" + count);

Log.v("data",

"currentData :"

+ String.valueOf(TrafficStats.getTotalTxBytes()));

Log.v("data", "startData :" + start_data);

}

};

}消息发送:

private void toggleTimer(boolean b) {

if(b == false){

timer.cancel();

timerTask.cancel();

}else{

updateUIHandler = new MyHandler(MainActivity.this.textView);

this.initTimerTask();

timer = new Timer();

timer.schedule(timerTask, 0, 5000);

}

}

处理的Handler类

package com.example.datastatisctest;

import java.text.DecimalFormat;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

import android.widget.TextView;

public class MyHandler extends Handler {

TextView updateTextView;

public MyHandler(TextView updateTextView) {

this.updateTextView = updateTextView;

}

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

//获得精确的值

double accurate = msg.getData().getDouble("showData");

//设置double数值的精度

DecimalFormat dcmFmt = new DecimalFormat("0.0");

double showData = Double.valueOf(dcmFmt.format(accurate));

//进制转换

switch (msg.what) {

case 0:

Log.i("data", showData + "B");

updateTextView.setText(showData + "B");

break;

case 1:

Log.i("data", showData + "KB");

updateTextView.setText(showData + "KB");

break;

case 2:

Log.i("data", showData + "MB");

updateTextView.setText(showData + "MB");

break;

case 3:

Log.i("data", showData + "GB");

updateTextView.setText(showData + "GB");

break;

default:

break;

}

}

}

大概就是这样了,需要的朋友可以下载源码自己测试下吧,原理很简单。

点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值