Android wifimanager.startscan() 在主线程还是在后台?

Android wifimanager.startscan() in main thread or in background?

当我想获取可用的 wifi 网络列表时,startscan 的什么原理更好? 我在主线程中执行此操作:

List<ScanResult> wifiList;
wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
if (!wifiManager.isWifiEnabled()) wifiManager.setWifiEnabled(true);
wifiManager.startScan();
wifiList = wifiManager.getScanResults();
for (int i = 0; i < wifiList.size(); i++) {
    String[] networkInfo = wifiList.get(i).toString().split(",");
    if (networkInfo[0].trim().equals(AP_SEARCH_SSID))
        petcub_networks++;
}

在我用于测试的所有设备中,它工作正常,除了少数三星智能手机。它发生在客户设备上,我无法快速调试它。 有人和三星有同样的问题吗?或者在后台扫描 AP 会更好?能解决我的问题吗?

**UPD:**接下来我的问题的本质:我想扫描可用的 wifi 网络,然后如果找到需要的网络,我将连接到它(到套接字)。这个过程像第一步一样在管道中使用。

很遗憾地通知您,但代码片段缺少很多元素(在效率方面)并且也不正确,让我详细说明一下:

  • startScan() 仅从 OS 请求扫描,在某些情况下它不会立即启动扫描。所以你需要检查调用
  • 中的return布尔值
  • 在调用 startScan 之前,您应该为 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 注册一个 BroadcastReceiver,只有在那之后您才应该得到结果
  • 您可能不需要多次启动扫描。一个相对较新的结果可能已经可用。您可以查看 ScanResult 的时间戳值 (API 17),以估计 "fresh" 扫描
  • 你根本不检查设备是否有WIFI硬件
  • 您只有在 Wifi 开启时才启动扫描,Android 设备(因为我认为 API 16)即使在 WIFI 关闭时也可以扫描网络 要检查您是否可以启动扫描,请使用此(在函数中 returns 布尔值):

    if (!context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
        return false;
    }
    WifiManager mWifiManager = (WifiManager) context
            .getSystemService(Context.WIFI_SERVICE);
    
    
    boolean ret = mWifiManager.isWifiEnabled();
    ret = ret || ((android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) &&
            mWifiManager.isScanAlwaysAvailable());
    return ret;