gpt4 book ai didi

java - 如何检测Android中的上传/下载传输速率?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:59 25 4
gpt4 key购买 nike

我正在开发一个上传大量数据的应用程序。我想确定上传的传输速率,以显示在通知中。

  • 一个 post建议使用不适用于移动数据的 WifiInfo
  • 另一个 post建议让网络类型来估计速度。

我对这些帖子的回答不满意,所以我再问一次。

我见过显示上传传输速率的应用程序,以及一些自定义 ROM,如 Resurrection Remix .

如何确定这些上传的传输速率?

最佳答案

通过android.net.TrafficStats获取转移的流量是可行的.这是测量上游和下游传输速率的想法的实现。您可以通过将 TrafficSpeedMeasurer.TrafficType.MOBILE 传递给 TrafficSpeedMeasurer 构造函数来测量移动网络的速率,否则使用 TrafficSpeedMeasurer.TrafficType.ALL 将导致测量一般流量(WiFi/移动)。此外,通过在 MainActivity 中设置 SHOW_SPEED_IN_BITS = true,您可以将速度测量单位更改为每秒 bits。

MainActivity.java

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

private static final boolean SHOW_SPEED_IN_BITS = false;

private TrafficSpeedMeasurer mTrafficSpeedMeasurer;
private TextView mTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = findViewById(R.id.connection_class);

mTrafficSpeedMeasurer = new TrafficSpeedMeasurer(TrafficSpeedMeasurer.TrafficType.ALL);
mTrafficSpeedMeasurer.startMeasuring();
}

@Override
protected void onDestroy() {
super.onDestroy();
mTrafficSpeedMeasurer.stopMeasuring();
}

@Override
protected void onPause() {
super.onPause();
mTrafficSpeedMeasurer.removeListener(mStreamSpeedListener);
}

@Override
protected void onResume() {
super.onResume();
mTrafficSpeedMeasurer.registerListener(mStreamSpeedListener);
}

private ITrafficSpeedListener mStreamSpeedListener = new ITrafficSpeedListener() {

@Override
public void onTrafficSpeedMeasured(final double upStream, final double downStream) {
runOnUiThread(new Runnable() {
@Override
public void run() {
String upStreamSpeed = Utils.parseSpeed(upStream, SHOW_SPEED_IN_BITS);
String downStreamSpeed = Utils.parseSpeed(downStream, SHOW_SPEED_IN_BITS);
mTextView.setText("Up Stream Speed: " + upStreamSpeed + "\n" + "Down Stream Speed: " + downStreamSpeed);
}
});
}
};

}

TrafficSpeedMeasurer.java

import android.net.TrafficStats;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.SystemClock;


public class TrafficSpeedMeasurer {

private ITrafficSpeedListener mTrafficSpeedListener;
private SamplingHandler mHandler;

private TrafficType mTrafficType;
private long mLastTimeReading;
private long mPreviousUpStream = -1;
private long mPreviousDownStream = -1;

public TrafficSpeedMeasurer(TrafficType trafficType) {
mTrafficType = trafficType;
HandlerThread thread = new HandlerThread("ParseThread");
thread.start();
mHandler = new SamplingHandler(thread.getLooper());
}

public void registerListener(ITrafficSpeedListener iTrafficSpeedListener) {
mTrafficSpeedListener = iTrafficSpeedListener;
}

public void removeListener() {
mTrafficSpeedListener = null;
}

public void startMeasuring() {
mHandler.startSamplingThread();
mLastTimeReading = SystemClock.elapsedRealtime();
}

public void stopMeasuring() {
mHandler.stopSamplingThread();
finalReadTrafficStats();
}

private void readTrafficStats() {
long newBytesUpStream = (mTrafficType == TrafficType.MOBILE ? TrafficStats.getMobileTxBytes() : TrafficStats.getTotalTxBytes()) * 1024;
long newBytesDownStream = (mTrafficType == TrafficType.MOBILE ? TrafficStats.getMobileRxBytes() : TrafficStats.getTotalRxBytes()) * 1024;

long byteDiffUpStream = newBytesUpStream - mPreviousUpStream;
long byteDiffDownStream = newBytesDownStream - mPreviousDownStream;

synchronized (this) {
long currentTime = SystemClock.elapsedRealtime();
double bandwidthUpStream = 0;
double bandwidthDownStream = 0;

if (mPreviousUpStream >= 0) {
bandwidthUpStream = (byteDiffUpStream) * 1.0 / (currentTime - mLastTimeReading);
}
if (mPreviousDownStream >= 0) {
bandwidthDownStream = (byteDiffDownStream) * 1.0 / (currentTime - mLastTimeReading);
}
if (mTrafficSpeedListener != null) {
mTrafficSpeedListener.onTrafficSpeedMeasured(bandwidthUpStream, bandwidthDownStream);
}

mLastTimeReading = currentTime;
}

mPreviousDownStream = newBytesDownStream;
mPreviousUpStream = newBytesUpStream;
}

private void finalReadTrafficStats() {
readTrafficStats();
mPreviousUpStream = -1;
mPreviousDownStream = -1;
}

private class SamplingHandler extends Handler {

private static final long SAMPLE_TIME = 1000;
private static final int MSG_START = 1;

private SamplingHandler(Looper looper) {
super(looper);
}

@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_START:
readTrafficStats();
sendEmptyMessageDelayed(MSG_START, SAMPLE_TIME);
break;
default:
throw new IllegalArgumentException("Unknown what=" + msg.what);
}
}

void startSamplingThread() {
sendEmptyMessage(SamplingHandler.MSG_START);
}

void stopSamplingThread() {
removeMessages(SamplingHandler.MSG_START);
}

}

public enum TrafficType {
MOBILE,
ALL
}

}

ITrafficSpeedListener.java

public interface ITrafficSpeedListener {

void onTrafficSpeedMeasured(double upStream, double downStream);
}

Utils.java

import java.util.Locale;

public class Utils {

private static final long B = 1;
private static final long KB = B * 1024;
private static final long MB = KB * 1024;
private static final long GB = MB * 1024;

public static String parseSpeed(double bytes, boolean inBits) {
double value = inBits ? bytes * 8 : bytes;
if (value < KB) {
return String.format(Locale.getDefault(), "%.1f " + (inBits ? "b" : "B") + "/s", value);
} else if (value < MB) {
return String.format(Locale.getDefault(), "%.1f K" + (inBits ? "b" : "B") + "/s", value / KB);
} else if (value < GB) {
return String.format(Locale.getDefault(), "%.1f M" + (inBits ? "b" : "B") + "/s", value / MB);
} else {
return String.format(Locale.getDefault(), "%.2f G" + (inBits ? "b" : "B") + "/s", value / GB);
}
}

}

.视觉效果

enter image description here

关于java - 如何检测Android中的上传/下载传输速率?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53393180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com