2017-12-18 5 views
0

スキャンを積極的に要求するにはどうすればよいですか?スキャンを積極的に要求する方法

WifiManager APIが提供する唯一の方法は、わかっているとおり、startScan()メソッドです。このメソッドは、Wi-Fiサービススキャンを受信する受信者を開始するだけです。問題はスキャン間の遅延です、それは時間がかかります!私があまり動かさなければ、スキャンは受けられません。私がそうした場合、気づくのに時間がかかります。

スキャンを動的にリクエストする方法はありますか?

これは私が使用するコードです:

// ... 
    wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    context.registerReceiver(this, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
    wifi.startScan(); 
} 

// ... 

@Override 
public void onReceive(Context context, Intent intent) 
{ 
    List<ScanResult> results = this.wifi.getScanResults(); 
    // ... 

編集:それは明確でない場合は

...

onReceive方法は時々スキャンを受けたが、それは時間がかかりすぎます。私はスキャンを開始したい、それが来るのを待つだけではありません。これは@Barnsが示唆しているように、スレッドで繰り返し実行することができます。

+1

はこのような何かを試してみてください。しかし、スキャンをトリガーする場合は、特定の間隔でループ上のバックグラウンドスレッドを使用してスキャンをトリガーすることができます。 – Barns

+0

@Barns、申し訳ありませんが、それは明らかではありませんでした。私は、サービスに通知するのを待つだけでなく、スキャンを開始したいと思う。トリガーには何を使用しますか?連続的に(間隔で)そのスレッドで 'startScan()'を呼び出しますか? –

答えて

0

好ましいコーディング溶液はpostDelayed代わりにThread.sleepHandlerを組み込むことになります。コールバックを削除することは重要です!たぶん私は非常にあなたが求めているものを理解していない

private boolean continueLoop = true; 
private Handler myHandler = new Handler(); 

private void startAutoDownloadManager() { 
    try{ 
     Log.d(TAG, "AutoDownloadManager - Started"); 
     // here the delay (in this example it is effectively the interval) is 1 second 
     myHandler.postDelayed(mAutoDownloadManager, 1000); 
    } 
    catch(Exception ex){ 
     Log.e(TAG, ex.getMessage()); 
    } 
} 

private Runnable mAutoDownloadManager = new Runnable() { 
    public void run() { 
     if(continueLoop){ 
      // preform the scan 
      this.wifi.startScan(); 

      //re-trigger the call to start the scan 
      startAutoDownloadManager(); 
     { 
    } 
}; 

// Make certain that you remove the callback when you leave the activity -- maybe in onPause() 
private void stopAutoDownloadManager(){ 
    try{ 
     myHandler.removeCallbacks(mAutoDownloadManager); 
    } 
    catch(Exception ex){ 
     Log.e(TAG, ex.getMessage()); 
    } 
} 
0

@Barnが示唆しているように、startScan()を使用してスキャンをトリガーすることができます。

私の間違いは、この方法ではスキャンの結果が受信され始め、すべてをWi-Fiサービスに残していると考えていました。しかし、それはスキャンを引き起こします。

だからこれは愚かな質問ですが、ここに残しておきます。誰かに役立つかもしれません。

コード:

// ... 
    new Thread(this).start(); 
} 

@Override 
public void run() 
{ 
    while (true) try 
    { 
     this.wifi.startScan(); 
     Thread.sleep(2000); 
    } 
    catch (InterruptedException e) { 
     Log.e("Location", e.getMessage()); 
    } 
} 
+0

はい!それはまさに私が意味していたものです。以下は、あなたのコードに若干の変更を加えました - (あなたのコードはうまく動作しますが)。私の提案は単に 'Thread.sleep'の代わりに' postDelayed'を使って 'Handler'を使います。 – Barns

関連する問題