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

}


大概就是這樣了,需要的朋友可以下載源碼自己測試下吧,原理很簡單。
點擊打開鏈接

發佈了21 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章