2017-05-04 85 views
0

我想在開關打開時每500毫秒重複一次功能。但是當我運行我的代碼時,當我設置開關時,一切凍結。這裏是我的代碼:Android:使用處理程序和開關時,應用程序會凍結

mySwitch.setChecked(false); 
    mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked){ 
       pom = true; 
       while (pom) { 
        final Handler h = new Handler(); 
        final int delay = 1000; 

        h.postDelayed(new Runnable(){ 
         public void run(){ 
          myClient.SendData("AA"); 
          h.postDelayed(this, delay); 
         } 
        }, delay); 
       } 
      } 
      else{ 
       pom = false; 
      } 
     } 
    }); 

我曾嘗試過這個,現在我的應用程序犯規凍結,現在它崩潰了下來:

mySwitch.setChecked(false); 
    mySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked){ 
       pom = true; 
       while (pom) { 
        int delay = 0; // delay for 0 sec. 
        int period = 500; // repeat every 10 sec. 
        Timer timer = new Timer(); 
        timer.scheduleAtFixedRate(new TimerTask() 
        { 
         public void run() 
         { 
          myClient.SendData("AA"); 
         } 
        }, delay, period); 
       } 
      } 
      else{ 
       pom = false; 
      } 
     } 
    }); 
+0

您必須將pom設置爲false或使用來自** while while循環內的** break。無論如何,你想做什麼? – nandsito

回答

0

問題是你是停留在一個無限循環在這裏。

while (pom) { 
       final Handler h = new Handler(); 
       final int delay = 1000; 

       h.postDelayed(new Runnable(){ 
        public void run(){ 
         myClient.SendData("AA"); 
         h.postDelayed(this, delay); 
        } 
       }, delay); 
      } 

程序無法退出此循環,因爲pom始終爲真。 它停止響應。

這將解決您的問題:
將交換機的狀態保存在sharedPreferences中,並將Runnable發佈到活動的任何位置。僅當sharedPreferences中的值爲true時發送數據。

+0

但是,如何在開關關閉時停止它? – pythoner

+0

編輯答案。現在檢查。 –

+0

不錯的主意,謝謝,我會嘗試! – pythoner