2

我正在尝试保存各种 wifi 扫描的 BSSID 和信号强度。但是,我只关心最近的四次扫描。当它扫描四次时它工作正常,但奇怪的事情开始发生,就像每次扫描的大小(结果的数量)在大约第 6 次扫描后是相同的。这段代码有问题吗?我将结果存储在一个集合列表中(尽管在处理数据时我只保留四个最新的集合)

  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()完成存储最新 Wifi 列表时广播的SCAN_RESULTS_AVAILABLE_ACTION Intent 。

我还建议使用 for-each 循环并创建对最新列表的引用,而不是使用 get()。在您的活动中:

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_ACTION您在 BroadcastReceiver 中捕获:

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 回答