Я работаю над реализацией обнаружения низкого интернет-соединения в своем приложении. Однако он не работает должным образом — сообщает о «низком интернете», даже если соединение сильное. Я хотел бы реализовать это без использования загрузки файлов, и я был бы очень признателен за ваши рекомендации о том, как надежно обнаружить низкий уровень интернета.
Найдите код, который я реализовал ниже.
Заранее спасибо.
public class NetworkQualityMonitor {
Я работаю над реализацией обнаружения низкого интернет-соединения в своем приложении. Однако он не работает должным образом — сообщает о «низком интернете», даже если соединение сильное. [b]Я хотел бы реализовать это без использования загрузки файлов[/b], и я был бы очень признателен за ваши рекомендации о том, как надежно обнаружить низкий уровень интернета. Найдите код, который я реализовал ниже. Заранее спасибо. public class NetworkQualityMonitor { [code]public interface NetworkQualityCallback { void onQualityChecked(Quality quality, long latency, double jitter, double packetLoss); }
public enum Quality { GOOD, MODERATE, POOR }
private final OkHttpClient client; private final String pingUrl = "https://www.google.com"; private final int pingCount; private final ExecutorService executor; private final Handler mainHandler;
// --- Caching state --- private long lastCheckTime = 0; private Quality lastQuality = Quality.POOR; private long lastLatency = -1; private double lastJitter = -1; private double lastPacketLoss = -1;
private static NetworkQualityMonitor networkQualityMonitor; private static final long CACHE_DURATION_MS = 7000; // 5 sec
public synchronized void checkQuality(Activity activity, boolean isFreshCheck, NetworkChecker.NetworkCheckCallback networkCheckCallback) { long now = System.currentTimeMillis();
// --- If cached result is still valid, return immediately --- if (now - lastCheckTime < CACHE_DURATION_MS && !isFreshCheck) { mainHandler.post(() -> networkCheckCallback.onNetworkCheckCompleted( lastQuality != Quality.POOR, lastQuality == Quality.POOR, 0 )); if (lastQuality == Quality.POOR) { retryCheck(activity, networkCheckCallback); // trigger retry } return; }
private void runNetworkTest(Activity activity, NetworkChecker.NetworkCheckCallback networkCheckCallback, boolean isRetry) { executor.execute(() -> { try { Quality quality; List rtts = new ArrayList(); int successCount = 0;
for (int i = 0; i < pingCount; i++) { long start = System.currentTimeMillis(); Request request = new Request.Builder().url(pingUrl).tag("" + System.currentTimeMillis()).build();
private void retryCheck(Activity activity, NetworkChecker.NetworkCheckCallback networkCheckCallback) { // Optional: Add a small delay before retry mainHandler.postDelayed(() -> runNetworkTest(activity, networkCheckCallback, true), 1000); }
public void navigateToLowNetworkActivity(Activity activity) { if (!(activity instanceof SplashActivity) && !(activity instanceof LowNetworkActivity)) { if (isNavigatingToLowNetwork) return; // already navigating isNavigatingToLowNetwork = true;
Intent intent = new Intent(activity, LowNetworkActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); activity.startActivity(intent);
// Reset flag after a delay (so navigation can happen again later if needed) mainHandler.postDelayed(() -> isNavigatingToLowNetwork = false, 5000); } }