2012-07-20 52 views
0

有沒有一種方法可以在不創建新計時器和任務的情況下執行此操作?我的代碼基本上每10秒掃描一次wifi信號。爲了確保掃描返回新的結果,我使用了另一個支持類。有人可以驗證這個也沒有任何明顯的錯誤嗎?如何停止運行代碼(使用定時器)直到按下按鈕

//Inside Button to start scanning 

    final int DELAY = 10000; 
     final Handler handler = new Handler(); 
     chkScan.setOnClickListener(new View.OnClickListener() { 
     final Handler handler = new Handler(); 
     ReceiverWifi = new WifiReceiver(); 
     WIFI_Manager = new wifiScanner(); 
     registerReceiver(receiverWifi, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
     final Timer timer = new Timer(); 
     final TimerTask task = new TimerTask() { 
     public void run() { 
     handler.post(new Runnable() { 
     public void run() { 

     mainWifi.startScan(); 
    if ((WIFI_Manager.resultsAvailable())) { 
      processResults();            
      } 
     // to ensure results come from latest scan 
     // say there are no new results as of now 
      WIFI_Manager.waitForNextScan(); 

    } 

      } 
      ); 
      timer.schedule(task, 0, DELAY); 

       } 

      } 
      }); 
     } 

    public void processResults() { 
    results = mainWifi.getScanResults(); 
    WIFI_Manager.pause() //stop getting wifi results 
    //continue to process here 
    // 
    // 



    //I wish to put a button here, but and wait for user input before continuing 
    //but scans continue.. 
    chkLabel.setOnTouchListener(new OnTouchListener() { 
    public boolean onTouch(View v, MotionEvent event) { 
    } 
    //more code 
    // ... 

    WIFI_Manager.resume();  
     }  




class WifiReceiver extends BroadcastReceiver { 

        @Override 
        public void onReceive(Context c, Intent intent) { 

         WIFI_Manager.getNewResults(); 

        } 

       } 

       public class wifiScanner { 

        public wifiScanner() { 

         Pause = false; 
         new_results = false; 

        } 

        public boolean resultsAvailable() { 

         return new_results; 
        } 

        public void waitForNextScan() { 

         new_results = false; 
        } 

        public void getNewResults() { 

         new_results = true; 

        } 

        public boolean onPause() { 

         return Pause; 

        } 

        public void pause() { 
         unregisterReceiver(receiverWifi); 
         Pause = true; 
        } 

        public void resume() { 
         registerReceiver(receiverWifi, new IntentFilter(
           WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
         Pause = false; 
        } 

        // pause: false- access to scan results are allowed 
        // pause: true- cannot access scan results 
        private boolean Pause; 

        // new_results: false- no new WIFI_resuls 
        // new_results: true - there are new results to be processed 
        private boolean new_results; 

       } 

回答

0

而不是使用一個定時器,創建一個名爲停止使用布爾域,並在迭代結束使用while(!stop)循環與Thread.sleep(1000)。你processResults()方法會做stop = true;並在重啓鍵的聽衆做了stop=false;

但我認爲它比使用定時器髒;)

相關問題