0

我對android應用程序開發相當新穎。我正在研究一個android應用程序來ping訪問點以訪問其RSSI值來估計用戶的位置。Android:連續掃描所有AP(接入點)

雖然我目前有這個'工作',但我相信在我的實現中有一個錯誤會創建太多的「onReceive()」調用。在應用程序的整個生命週期中,對這個函數的調用量都是線性的。

我將要發佈的代碼的目標是簡單地掃描WiFi接入點,獲取其RSSI值,然後不斷循環。電池壽命不成問題,性能是一個更重要的指標。

MainActivity.java:

Handler handler = new Handler(); 
final Runnable locationUpdate = new Runnable() { 
    @Override 
    public void run() { 
     getLocation(); 

     //customView.setLocation(getX_pixel(curLocation.getX()), getY_pixel(curLocation.getY())); 
     //customView.invalidate(); 

     handler.postDelayed(locationUpdate, 1000); 
    } 
}; 

private void getLocation() { 
    Context context = getApplicationContext(); 
    WifiScanReceiver wifiReceiver = new WifiScanReceiver(); 
    registerReceiver(wifiReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    wifiManager.startScan(); 
    Log.d("START SCAN CALLED", ""); 
} 

然後在相同的文件中,在onCreate()方法:

handler.post(locationUpdate); 

然後,在相同的文件中,onCreate()方法之外:

class WifiScanReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context c, Intent intent) { 
     WifiManager wifiManager = (WifiManager) c.getSystemService(Context.WIFI_SERVICE); 

     List<ScanResult> scan = wifiManager.getScanResults(); 
     // Application specific code: 
     sortScan(scan); 
     count+= 1; 
     System.out.println("Count: " + count); 

     } 
    } 
}; 

我確認了斜坡/線程問題,因爲當程序到達時我遞增並輸出到控制檯「sortScan(掃描)」,您可以清楚地看到結果呈線性上升。

就像我剛纔說的那樣,我的目的是在第一次掃描完成後立即重新掃描,並在應用程序的整個生命週期中對其進行循環。

任何幫助將不勝感激,謝謝。

回答

0

您正在重複註冊您不需要的接收器。只需在onCreate()中註冊WifiScanReceiver一次。然後調用getLocation()函數中的開始掃描。

WifiManager wifiManager; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Context context = getApplicationContext(); 
    WifiScanReceiver wifiReceiver = new WifiScanReceiver(); 
    registerReceiver(wifiReceiver, new 
       IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    wifiManager = 
       (WifiManager)context.getSystemService(Context.WIFI_SERVICE); 



Handler handler = new Handler(); 
final Runnable locationUpdate = new Runnable() { 
    @Override 
    public void run() { 
     getLocation(); 
     //This line will continuously call this Runnable with 1000 milliseconds gap 
     handler.postDelayed(locationUpdate, 1000); 
    } 
}; 

private void getLocation() { 
    wifiManager.startScan(); 
    Log.d("START SCAN CALLED", ""); 
} 

} 


class WifiScanReceiver extends BroadcastReceiver { 
@Override 
public void onReceive(Context c, Intent intent) { 

    if(intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)){ 

     //New scan results are available. Arrange a callback to the activity here. 
    } 
    } 
} 

你不應該在onReceive()中進行繁重的處理。安排一個回調到活動來做到這一點。

0

您每次運行getLocation()時都會創建一個新的廣播接收器。每個接收者都獲得WifiManager.SCAN_RESULTS_AVAILABLE_ACTION廣播。嘗試在適當的上下文中分配和註冊一次接收機,並且只需撥打startScan()中的getLocation()即可。

0

連續循環掃描WiFi AP的RSSI值的最佳方法是簡單地在OnCreate中啓動第一次掃描。然後在BroadcastReceiver的onReceive回調中,再次調用開始掃描。