2010-06-05 36 views
5

Tôi đang cố gắng quét tìm mạng không dây và tìm thấy nguồn hữu ích này trên mạng. Thật không may nó không hoạt động và tôi không biết tại sao. Vấn đề của tôi là tôi không thể chờ đợi 10 phút cho kết quả - tôi cần chúng trong vòng vài giây và nghĩ về việc thiết lập biến boolean chờ đợi trên false ngay sau khi tôi nhận được kết quả .... tốt, nó chạy mãi mãi .. Có vẻ như không có gì được nhận. Bất kỳ ý tưởng ? Cảm ơn.Quét Android cho mạng 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

cũng rất tuyệt. Bạn đã thử nghiệm nó trên thiết bị thực hoặc giả lập @Nils? – gumuruh

Trả lời

3

Tôi không biết gì về tăng tốc quá trình, có thể chỉ mất một lúc để tìm tín hiệu wifi (tức là wifi của bạn không bật ... chương trình nên kiểm tra trước khi nó bắt đầu). Tuy nhiên, một điều bạn có thể làm để cải thiện quy trình làm việc của mình là thực hiện tất cả điều này trong một hoạt động khác bằng cách sử dụng startActivityForResult(). Bằng cách đó, hoạt động "chính" của bạn sẽ có thể hoạt động trên dữ liệu đó sau khi nó được thực hiện và bạn sẽ không phải ăn cpu trên một vòng lặp while.

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

Bạn đặt mã này ở đâu? Trong số onCreate của một hoạt động?

Vấn đề là bạn đang đăng ký gọi lại sẽ nhận được khi bạn nhận kết quả quét, trong đó according to the Android API docs được thực hiện trong một chuỗi riêng biệt, do đó vòng lặp bận của bạn không đạt được gì trong trường hợp này ngoại trừ hoạt động, và nếu nó trong thời gian onCreate có nghĩa là nó không bao giờ thoát khỏi phương pháp.

+0

Vâng, đó là phương pháp onCreate ... Tôi đã chuyển nó ngay bây giờ sang OnStart, nhưng nó vẫn không hoạt động ... có vẻ như chức năng onReceive không bao giờ được gọi là ... có thể đâu đó có lỗi không? Tôi chạy tốt, nhưng nó không bao giờ thoát khỏi vòng lặp này ... – Nils

+2

bạn sẽ không muốn đặt nó vào bất kỳ phương thức onCreate, onRestart, onStart nào vì chúng đều đặt cùng một vấn đề: bạn sẽ không bao giờ thoát khỏi các phương thức đó, do đó gọi lại sẽ không bao giờ xảy ra. – mtmurdock

3

Ok, tôi đã tìm thấy lỗi.

Đó là vòng lặp. Có vẻ như hàm onReceive không bao giờ được gọi là hoạt động chỉ chạy vòng lặp này. Có vẻ như chương trình phải đến cuối chức năng để thực hiện chức năng khác như OnReceive ...

Cảm ơn sự giúp đỡ của bạn. Nó đã giúp tôi cải thiện nó một chút :)

10

bạn cần phải thực hiện một BroadcastReceiver nghe cho kết quả quét quay trở lại từ WifiManager.startScan(). onReceive() cho phép bạn truy cập vào quét resuls trực tiếp. nó mất khoảng 1 giây cho quá trình quét hoàn tất và kích hoạt onReceive() ...

+1

Đây là câu trả lời đúng. Đó là cách Android, và cho phép bạn gần như ngay lập tức nhận được dữ liệu mới. – Eagle

0

Bạn nên viết trong BroadcastReceiver như thế này:

  1. đăng ký nó
  2. Sau đó startScan và làm như thế này

    if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) { 
    
    super.onReceive(context, intent);   
    //Scan is ok, just need few seconds! 
    } 
    
Các vấn đề liên quan