2010-06-05 183 views
5

我正在嘗試掃描無線網絡並在網絡上找到這個有用的來源。 不幸的是,它不工作,我不知道爲什麼。我的問題是,我不能等待10分鐘的結果 - 我需要它們在幾秒鐘內,並想到設置布爾變量等待false,只要我得到一個結果....嗯,它永遠運行..看起來沒有收到任何東西。任何想法 ?謝謝。Android掃描WiFi網絡

// -- Sample WiFi implementation - http://groups.google.com/group/android-developers/browse_thread/thread/f722d5f90cfae69 
     IntentFilter i = new IntentFilter(); 
     i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); 
      registerReceiver(new BroadcastReceiver(){ 
       @Override 
       public void onReceive(Context c, Intent i){ 
        // Code to execute when SCAN_RESULTS_AVAILABLE_ACTION event occurs 
        mWifiManager = (WifiManager) c.getSystemService(Context.WIFI_SERVICE); 
        wireless = mWifiManager.getScanResults(); // Returns a <list> of scanResults 
        waiting = false; 
       } 
      } 
     ,i); 
     // -- End Wifi Sample 


     mWifiManager.startScan(); 


     while (waiting) { 
      try { 
       Thread.sleep(200); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      Log.d("PROJECT1","Wifi WAITING"); 
     } 
+0

這是不錯的嘗試。你在真實設備或模擬器@Nils上測試過它嗎? – gumuruh 2014-05-20 15:10:26

回答

3

嗯,我不知道關於加快過程任何東西,它可能只是它需要一段時間才能找到WiFi信號(即,或者你的wifi沒有打開......這恐怕是你的程序應該在開始之前檢查)。但是,您可以通過startActivityForResult()在不同的活動中完成所有這些工作。這樣,你的「主要」活動就可以在數據完成後處理這些數據,並且你不必在while循環中吃掉CPU。

public void onActivityResult(....){ 
    switch(retCode){ 
    case SCAN_ACTIVITY:{ 
     //do stuff 
     } 
    } 
} 
4

你把這段代碼放在哪裏?在一個活動的onCreate

問題是,您註冊的回調將在您收到掃描結果時被調用,其中according to the Android API docs是在單獨的線程中完成的,因此您的忙碌等待循環在此情況下無法實現,除非不必要地停止活動,如果在onCreate期間,這意味着它永遠不會退出該方法。

+0

是的,它是在onCreate方法...我現在把它移動到OnStart,但它仍然無法正常工作......似乎onReceive函數從來沒有被調用......是否有可能出現錯誤?我運行良好,但它永遠不會退出這個循環... – Nils 2010-06-06 00:51:43

+2

你不會想要把它放在onCreate,onRestart,onStart方法中的任何一個,因爲它們都提出了同樣的問題:你永遠不會退出這些方法,因此回調將永遠不會發生。 – mtmurdock 2010-06-06 04:31:43

3

好吧,我發現了錯誤。

這是循環。它看起來像onReceive函數永遠不會被調用,因爲活動只運行此循環。看起來像程序必須達到功能的結尾來執行其他功能,如OnReceive ...

感謝您的幫助任何方式。它幫助我改進了一下:)

10

你需要實現一個BroadcastReceiver偵聽從WifiManager.startScan(). onReceive()返回的掃描結果,允許你直接訪問掃描結果。 ,約需要1秒掃描完成並引發onReceive() ...

+1

這是正確的答案。這是android的方式,可以讓你幾乎立即獲得新的數據。 – Eagle 2012-08-02 15:31:13

0

你應該BroadcastReceiver這樣寫:

  1. 註冊它
  2. 然後startScan,做這樣的

    if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) { 
    
    super.onReceive(context, intent);   
    //Scan is ok, just need few seconds! 
    }