2016-05-26 7 views
0

Ich erstelle eine App, die nach umgebenden Zugangspunkten suchen muss und nach den Ergebnissen einige Berechnungen durchführen muss. Inzwischen bin ich davon überzeugt, dass die Methode WifiManager.statScan(), obwohl sie einen neuen Scan initiiert, nicht automatisch die Ergebnisse eines neuen Scans liefert.Wie kann ich jedes Mal, wenn ich eine Taste drücke, neue Scan-Ergebnisse in meinem Android-Telefon erhalten?

Dies ist mein Code:

public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.button: 
      //do some reseting for the GUI and the values of the problem. 
      break; 
     case R.id.button2: 
      wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
      wifiManager.startScan(); 
      List<ScanResult> scanResult = null; 
      if(wifiManager.startScan()){ 
       scanResult = wifiManager.getScanResults(); 
      } 
      // Do the calculations. 
      break; 

    } 
} 

Mein Problem ist, dass ich nicht sicher bin, ob mit diesem Code bekomme ich tatsächlich die Ergebnisse des eingeleiteten Scan oder die Ergebnisse aus früheren Scans kommen, und wenn diese richtig, wie bekomme ich die Ergebnisse vom neuen Scan?

Vielen Dank.

Nach der Suche und in verschiedenen Funktionen und Tutorias lesen, hat mein Code wie folgt transformiert:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 
BroadcastReceiver receiver; 
private List<ScanResult> scanResult; 
boolean waiting; 
// and other irrelevant variables. 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //initialization of the elements of the GUI 
    reset.setOnClickListener(this); 
    locate.setOnClickListener(this); 
    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    waiting = true; 
    receiver = new WifiScaner(this); 
    registerReceiver(receiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 

} 

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.button: 
      // resetting the variables of the application 
      break; 
     case R.id.button2: 
      wifiManager.startScan(); 
      while (waiting) { 
       try { 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Log.d("PROJECT1","Wifi WAITING"); 
      } 
      //Calculations 
      break; 

    } 
} 

public class WifiScaner extends BroadcastReceiver{ 
    MainActivity main; 
    public WifiScaner(MainActivity main){ 
     super(); 
     this.main = main; 
    } 
    public void onReceive(Context c, Intent intent) { 
     scanResult = main.wifiManager.getScanResults(); 
     waiting = false; 
     Log.d("PROJECT1","Wifi RECEIVED"); 
    } 
} 

} Aber aus irgendeinem Grund scheint es, dass ich nie in die OnReceive von WifiScaner zu bekommen. Irgendwelche Hinweise, warum das passiert?

Antwort

1

Sie haben Recht, ein Scan dauert einige Zeit, damit die Ergebnisse nicht sofort verfügbar sind. Dies wird vom doc für die Methode startScan() bestätigt:

"Abfrage nach Zugriffspunkten anfordern. Rückgabe sofort. Die Verfügbarkeit der Ergebnisse wird später durch ein asynchrones Ereignis bekannt gegeben, das nach Abschluss des Scans gesendet wird."

Der folgende Link scheint ein gutes Beispiel zu haben, wie man benachrichtigt wird, wenn der Scan abgeschlossen ist: http://www.tutorialspoint.com/android/android_wi_fi.htm.

+0

Ja, ich habe die Idee aus dem Tutorial, aber wie kann ich warten, um die Ergebnisse aus dem Scan zu erhalten? Wenn ich die Anwendung starte, stürzt es ab, weil die Liste noch nichts enthält. – user2149122

+0

Verarbeiten Sie die Liste nicht, bis der Listener ausgelöst wird. –

Verwandte Themen