android流量统计

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

后面懒了直接打开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;
		}
	}

}


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值