2011-01-27 10 views
3

各スキャン結果の間の現在の6秒の遅延が長すぎるため、Wi-Fiスキャンを1秒ごとにスケジュールしようとしています。私はどういうわけか、それは動作すると思うが、私はほとんどそれが動作する方法または結果を理解する。 ここには、タイマーにwifiMgr.startScan();を1000ミリ秒ごとに開始するように伝える基本コードがあります。Wi-Fiスキャンのタイマーを使用して予期しない結果が発生しました。

private void startNetworkScan() { 
    mTimer = new Timer(); 
    mTimer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      TimerMethod(); 
     } 
    }, 0, 1000); 
} 

private void TimerMethod() { 
    this.runOnUiThread(rTimer); 
} 

private Runnable rTimer = new Runnable() { 
    public void run() { 
     wifiMgr.startScan(); 
     Bundle bb = wifiScanReceiver.getResultExtras(true); 
     txtList.append("Result " + bb.getString("scanresult") + "\n"); 
    } 
}; 

以下は、BroadcastReceiverクラスのコードです。私はタイムスタンプと関連情報をアクセスポイントから表示するだけです。

private void handleScanResultsAvailable() { 
    List<ScanResult> results = wifiMgr.getScanResults(); 

    String currentTimeStr = new SimpleDateFormat("HH:mm:ss").format(new Date()); 
    Bundle b = new Bundle(); 
    StringBuilder sb = new StringBuilder(); 
    sb.append(i + ": " + currentTimeStr); 
    for (ScanResult result : results) { 
     sb.append(String.format(" SSID: %s, RSSI: %s dBm ", result.SSID, result.level)); 
    } 
    b.putString("scanresult", sb.toString()); 
    setResultExtras(b); 
    i++; 
} 

そして、ここでは結果のスニペットです:

Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm 
Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm 
Result 2: 10:04:14 SSID: XXXXX, RSSI: -87 dBm 
Result 2: 10:04:14 SSID: XXXXX, RSSI: -87 dBm 

は、主にそれぞれの結果はかなり良いですこれは、すべての1~2秒に表示されています。私が理解できないことは、それぞれの結果について、常に同じ値を持つ2つの行が得られることです。

// there are ca. 6-7 lines for every record 
// as the wifi scanresult delay is 6 secs 
Result 1: 10:03:40 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:41 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:42 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:43 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:44 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:45 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:45 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:46 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:46 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:47 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:47 SSID: XXXXX, RSSI: -85 dBm 
Result 1: 10:03:48 SSID: XXXXX, RSSI: -85 dBm 
Result 2: 10:03:48 SSID: XXXXX, RSSI: -85 dBm 

誰でもいくつかの光を当てることができます:私は実際にこのように、wifiMgr.startScan()はタイマーによって、すべての実行で停止されていないため、一部重複結果がなければならないことを期待しますか? - コードは正しいです、結果は良いです。それの背後にある論理についての説明を感謝します。

更新:ここに残りのBroadcastReceiverコードがあります。

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equalsIgnoreCase(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { 
     handleScanResultsAvailable(); 
    } 
} 

答えて

0

結果が複数の結果が含まれている場合、それはのような出力を生成するように、あなたのSBは、あなたのループの外で初期化されていますので、重複ライン出力がどのコードである可能性があり

Result 1: 10:04:12 SSID: XXXXX, RSSI: -88 dBm SSID: XXXXX, RSSI: -85 dBm 

結果を出力します。

rTimer実行コードでは、wifiMgr.startScan()を呼び出してスキャンを開始しますが、すぐに戻りますので、次の行には期待したデータが得られません。

おそらく受信者はandroid.net.wifi.SCAN_RESULTSを受信します。これをチェックしてそこに結果を出力する必要があります。

基本的に、データリクエストとデータリターンは同期されません。あなたはデータを要求しますが、それが返される前にそれを表示しようとします。

何が起きているのかを確認するにはログインできますか?

/*DEBUG*/Log.d(this.getClass().getName(), "run: Started"); 

とhandleScanResultsAvailableの開始時:

/*DEBUG*/Log.d(this.getClass().getName(), "handleScanResultsAvailable: Started"); 
+0

はい、それは1つの結果行に複数のSSIDが表示されますwifiMgr.startScan()の前に 。上記の結果は、テストしたときにSSIDが1つしか検出されなかったため、SSIDが1つしか表示されないことを示しています。以前はタイマーなしで、私はhandleScanResultsAvailableで結果を出力しましたが、タイマーを使用しないかのように通常の出力を表示します。私はここにログ出力を投稿します、http://pastebin.com/zFjfuL7t時間をとってくれてありがとう! – springrolls

+0

1.活動の開始からの最新の結果は、呼び出しを行う前にデータが受信されているように見えるため、活動の開始からの最新の結果です。 2.より多くの放送受信機コードを貼り付けることができますか? 3. onReceiveルーチンはありますか?インテントで渡されるアクションは何ですか? 4。startscanを呼び出してスキャン結果を受け取るまでにどれくらい時間がかかりますか?非常に多くの質問:-) – FrinkTheBrave

+0

はい、これは活動の開始からの結果です。ヌルまたは何も表示しない最初の数行は、まだスキャン結果が利用できない場合です。私はそれが約5秒かかると思います。基本的に、私は 'SCAN_RESULTS_AVAILABLE_ACTION'とTimer([this](http://steve.odyfamily.com/?p=12)のチュートリアルを使用して)のBroadcastReceiverのコードをマージします。ボタンをクリックすると、1秒ごとに 'startScan()'を実行するタイマーが起動します。 – springrolls

関連する問題