2

さまざまなwifiスキャンのBSSIDと信号強度を保持しようとしています。ただし、最近の 4 つのスキャンだけを気にします。4 回スキャンすると問題なく動作しますが、その後、奇妙なことが起こり始め、各スキャンのサイズ (結果の数) は、約 6 回のスキャン後に同じになります。このコードに何か問題がありますか? 結果をセットのリストに保存します (データを処理するときは、最新の 4 つのセットのみを保持します)

  public class MainActivity extends Activity {

    List<HashSet<Pair>> addresses = new ArrayList<HashSet<Pair>>();
    List <ScanResults> results;


    ...
    @Override
    public void onCreate(Bundle savedInstanceState) {
    //This whole part of the code is run once every ten seconds through use of a timer
    mainWifi.startScan();
    results = mainWifi.getScanResults();


    int entry = addresses.size();

        if (entry == 4) { // already has 4 addresses
        addresses.remove(0); // remove the
                                                    // oldest
                                                    // set
                            entry = 3;
                        }
    addresses.add(entry, new HashSet<Pair>());

    for (int i = 0; i < results.size(); i++) {

        addresses.get(entry).add(new Pair(results.get(i).BSSID,results.get(i).level));
    }

}
4

1 に答える 1

2

更新しました

WifiManager.startScan()が終了したときにブロードキャストされるSCAN_RESULTS_AVAILABLE_ACTIONインテントを待って、最新の Wifi リストを保存することをお勧めします。

また、get() を使用するのではなく、for-each ループを使用して最新のリストへの参照を作成することもお勧めします。アクティビティで:

List<List<Pair<String, Integer>>> addresses = new ArrayList<List<Pair<String, Integer>>>();
List<Pair<String, Integer>> list;
...

public void newWifiResults() {
    list = new ArrayList<Pair<String, Integer>>();
    if(addresses.size() > 3) {
        addresses.remove(0);

    results = mainWifi.getScanResults();
    for(ScanResult result : results) 
        list.add(new Pair<String, Integer>(result.BSSID, result.level));

    addresses.add(list);
    // call mainWifi.startScan() again after a delay
}

SCAN_RESULTS_AVAILABLE_ACTIONBroadcastReceiver でキャッチします。

public class WifiReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // We are only listening for one type of intent, no verifying necessary 
        newWifiResults();
    }
}

これをネストされた/サブクラスとしてアクティビティにも配置すると、onReceive() は簡単に newWifiActivity() を呼び出すことができます。

最後に、Activity でレシーバーへの参照を作成する必要があります。

private WifiReceiver wifiReceiver = new WifiReceiver();

onCreate() または onResume() で、レシーバーを登録します。

registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));

そして、一致するメソッド (onDestroy() または onPause()) で、レシーバーを登録解除します。

unregisterReceiver(wifiReceiver);

これはより複雑ですが、コードは startScan() から新しい結果セットが返された場合にのみ実行されます。

于 2012-07-19T07:31:02.993 に答える