3 votes

résultat inattendu de l'utilisation de la minuterie pour le scan wifi Android

J'essaie de programmer un scan wifi toutes les 1 secondes car le délai actuel de 6 secondes entre chaque résultat de scan est trop long pour moi. Je pense que cela fonctionne d'une manière ou d'une autre, mais j'ai du mal à comprendre la manière dont cela fonctionne ou le résultat. Voici le code de base qui dit au timer de démarrer wifiMgr.startScan(); toutes les 1000 ms.

private void startNetworkScan() {
    mTimer = new Timer();
    mTimer.schedule(new TimerTask() {
        @Override
        public void run() {
            TimerMethod();
        }
    }, 0, 1000);
}

private void TimerMethod() {
    this.runOnUiThread(rTimer);
}

private Runnable rTimer = new Runnable() {
    public void run() {
        wifiMgr.startScan();
        Bundle bb = wifiScanReceiver.getResultExtras(true);
        txtList.append("Result " + bb.getString("scanresult") + "\n");
    }
};

Voici le code de la classe BroadcastReceiver. Je me contente d'afficher l'horodatage et les informations connexes provenant du point d'accès.

private void handleScanResultsAvailable() {
    List<ScanResult> results = wifiMgr.getScanResults();

    String currentTimeStr = new SimpleDateFormat("HH:mm:ss").format(new Date());
    Bundle b = new Bundle();
    StringBuilder sb = new StringBuilder();
    sb.append(i + ": " + currentTimeStr);
    for (ScanResult result : results) {
        sb.append(String.format(" SSID: %s, RSSI: %s dBm ", result.SSID, result.level));
    }
    b.putString("scanresult", sb.toString());
    setResultExtras(b);
    i++;
}

Et voici un extrait du résultat :

Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm 
Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm 
Result 2: 10:04:14 SSID: XXXXX, RSSI: -87 dBm 
Result 2: 10:04:14 SSID: XXXXX, RSSI: -87 dBm 

En général, chaque résultat est affiché toutes les 1 à 2 secondes, ce qui est plutôt bien. Ce que je ne comprends pas, c'est que pour chaque résultat, j'obtiens toujours deux lignes avec la même valeur. En fait, je m'attends à ce qu'il y ait des résultats qui se chevauchent parce que wifiMgr.startScan() n'est pas arrêté à chaque exécution par le timer, comme ceci :

// there are ca. 6-7 lines for every record
// as the wifi scanresult delay is 6 secs
Result 1: 10:03:40 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:41 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:42 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:43 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:44 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:45 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:45 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:46 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:46 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:47 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:47 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:48 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:48 SSID: XXXXX, RSSI: -85 dBm 

Quelqu'un peut-il nous éclairer ? - Le code est-il correct, le résultat est-il correct ? J'apprécierais toute explication sur la logique sous-jacente.

Mise à jour : Voici le reste du code de BroadcastReceiver.

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equalsIgnoreCase(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
        handleScanResultsAvailable();
    }
}

0voto

FrinkTheBrave Points 1272

Votre sb est initialisé en dehors de votre boucle for, de sorte que si les résultats contenaient plus d'un résultat, il produirait une sortie comme :

Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm  SSID: XXXXX, RSSI: -85 dBm 

Par conséquent, la ligne en double se trouve probablement dans le code qui produit les résultats.

Dans le code d'exécution de votre rTimer, vous appelez wifiMgr.startScan() pour démarrer le scan, mais ce dernier sera renvoyé immédiatement, de sorte que la ligne suivante n'obtiendra pas les données que vous attendez.

Votre récepteur reçoit probablement Android.net.wifi.SCAN_RESULTS. Il devrait vérifier cela et afficher les résultats à cet endroit.

En fait, vos demandes et vos retours de données ne sont pas synchronisés. Vous demandez les données, mais vous essayez de les afficher avant qu'elles ne soient renvoyées.

Pouvez-vous mettre en place une connexion pour voir ce qui se passe ? Avant wifiMgr.startScan() :

/*DEBUG*/Log.d(this.getClass().getName(), "run: Started");

et au début de handleScanResultsAvailable :

/*DEBUG*/Log.d(this.getClass().getName(), "handleScanResultsAvailable: Started");

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X