What interval should I use between every WiFi check on Android?

I need to do a wifi scan at regular intervals. I ran into a problem when the time interval is set to 1-2 seconds. I don't seem to get any ScanResult . Is the minimum amount of time set so that WifiManager can perform a successful WiFi scan?

Here is the code. I use Service to scan Wifi:

 public class WifiScanning extends Service{ private static final String TAG = "WifiScanning"; private Timer timer; public int refreshRate, numberOfWifiScan, wifiScanGranularity; WifiReceiver receiverWifi = new WifiReceiver(); WifiManager wifi; StringBuilder sb; List<ScanResult> wifiList; List<APData> apdataList; List<List<APData>>surveyData; private TimerTask updateTask = new TimerTask() { @Override public void run() { Log.i(TAG, "Timer task doing work"); wifi.startScan(); } }; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { super.onCreate(); Log.i(TAG, "Service creating"); //retrieve the mapRefreshRate from config.xml XMLOperations test = new XMLOperations(); Configuration config = new Configuration(); config = test.saxXmlParsing(this, 1); if(config==null) config = test.saxXmlParsing(this, 2); refreshRate = Integer.parseInt(config.getMapRefreshRate()); numberOfWifiScan = Integer.parseInt(config.getNumberOfWifiScan_Positioning()); wifiScanGranularity = Integer.parseInt(config.getWifiScanGranularity_Positioning()); timer = new Timer(); Log.i(TAG, "Refresh Rate: "+ String.valueOf(refreshRate)); timer.schedule(updateTask, 0, refreshRate); wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); registerReceiver(receiverWifi, new IntentFilter( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); } @Override public void onDestroy() { super.onDestroy(); Log.i(TAG, "Service destroying"); unregisterReceiver(receiverWifi); if (timer != null){ timer.cancel(); timer.purge(); timer = null; } } class WifiReceiver extends BroadcastReceiver { public void onReceive(Context c, Intent intent) { sb = new StringBuilder(); wifiList = wifi.getScanResults(); String ap_ssid; String ap_mac; Double ap_rssi; for(int i = 0; i < wifiList.size(); i++){ ap_ssid = wifiList.get(i).SSID; ap_mac = wifiList.get(i).BSSID; ap_rssi = Double.valueOf(wifiList.get(i).level); APData ap = new APData(ap_ssid,ap_mac,ap_rssi); apdataList.add(ap); sb.append(" " + (wifiList.get(i).SSID).toString()); sb.append(" " + (wifiList.get(i).BSSID).toString()); sb.append((" " + String.valueOf(wifiList.get(i).level))); sb.append("\n"); } Log.d(TAG, sb.toString()); for(int i=1; i<=numberOfWifiScan; i++){ surveyData.add(apdataList); } } } } 

However, it looks like I'm getting Nullpointer on this line: apdataList.add(ap); . So I ask myself, is the interval too short that causes ScanResult empty?

+7
source share
1 answer

EDIT after posting code:

apdataList doesn't seem to be initialized in onCreate ()

add this to onCreate ():

 apdataList = new List<APData>(); 

Minimum Scan Delay

I think there is no absolute minimum scan delay. It depends too much on the characteristics of the equipment.

My advice is that you add the “As soon as possible” option to your preferences, then use an asynchronous loop that restarts the scan as soon as new results are found (see the code snippet below, it was updated according to your needs) . Thus, this will be limited only by hardware specifications.


You can also poll ScanResults using WifiManager.getScanResults() recommended way is to run WifiManager.startScan() and configure BroadcastReceiver for WifiManager.SCAN_RESULTS_AVAILABLE_ACTION to be notified as soon as the scan results are ready.

Here's a sample code (borrowed from here and adapted to your needs):

 IntentFilter i = new IntentFilter(); i.addAction (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); registerReceiver(new BroadcastReceiver(){ public void onReceive(Context c, Intent i){ // Code to execute when SCAN_RESULTS_AVAILABLE_ACTION event occurs WifiManager w = (WifiManager) c.getApplicationContext().getSystemService(Context.WIFI_SERVICE); //Use getApplicationContext to prevent memory leak myScanResultHandler(w.getScanResults()); // your method to handle Scan results if (ScanAsFastAsPossible) w.startScan(); // relaunch scan immediately else { /* Schedule the scan to be run later here */} } }, i ); // Launch wifiscanner the first time here (it will call the broadcast receiver above) WifiManager wm = (WifiManager)getApplicationContext.getSystemService(Context.WIFI_SERVICE); boolean a = wm.startScan(); 
+13
source

All Articles