原始想法是按一个键,就进行一次页面跳转,之后开始统计流量次数,单位进行变化。
后面懒了直接打开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);
}
}
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;
}
}
}
大概就是这样了,需要的朋友可以下载源码自己测试下吧,原理很简单。
点击打开链接