Android:使用处理程序和开关时,应用程序会冻结

问题描述:

我想在开关打开时每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

问题是你是停留在一个无限循环在这里。

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