原始想法是按一個鍵,就進行一次頁面跳轉,之後開始統計流量次數,單位進行變化。
後面懶了直接打開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;
}
}
}
大概就是這樣了,需要的朋友可以下載源碼自己測試下吧,原理很簡單。
點擊打開鏈接