4

ワイヤレス ネットワークをスキャンしようとしているところ、ネット上でこの役立つ情報源を見つけました。残念ながら、それは機能していません。その理由はわかりません。私の問題は、結果が出るまで 10 分待てないことです。数秒以内に結果が必要で、結果が得られたらすぐにブール変数を false で待機させることを考えました.... まあ、それは永遠に実行されます.. . 何も受信していないようです。何か案が ?ありがとう。

// -- 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");
        }
4

5 に答える 5

9

から返されたスキャン結果をリッスンするBroadcastReceiverを実装して、スキャン結果にWifiManager.startScan(). onReceive()直接アクセスできるようにする必要があります。スキャンが完了してトリガーされるまで約1秒かかりonReceive()ます...

于 2010-08-11T08:52:07.400 に答える
3

このコードはどこに置いていますか?活動のonCreate中で?

問題は、スキャン結果を受け取ったときに呼び出されるコールバックを登録していることです.Android APIドキュメントによると、これは別のスレッドで行われるため、ビジー待機ループはこの状況では不必要に停止する以外は何も達成していません.あなたの活動、そしてそれが実行中の場合、それonCreateはメソッドを決して終了しないことを意味します。

于 2010-06-05T22:51:38.423 に答える
2

わかりました、私は間違いを見つけました。

ループでした。アクティビティがこのループのみを実行するため、onReceive 関数が呼び出されることはないようです。OnReceive などの他の関数を実行するには、プログラムが関数の最後に到達する必要があるようです ...

とにかく助けてくれてありがとう。少し改善するのに役立ちました:)

于 2010-06-06T01:21:02.607 に答える
2

プロセスの高速化については何も知りません。wifi信号を見つけるのに時間がかかる可能性があります(または、wifiがオンになっていません...これは、プログラムが開始する前にチェックする必要があるものです)。ただし、ワークフローを改善するためにできることの 1 つは、startActivityForResult() を使用して別のアクティビティでこれらすべてを行うことです。そうすれば、「メイン」アクティビティは、完了後にそのデータを処理できるようになり、while ループで CPU を使い果たす必要がなくなります。

public void onActivityResult(....){
   switch(retCode){
   case SCAN_ACTIVITY:{
         //do stuff
      }
   }
}
于 2010-06-05T22:36:22.380 に答える