Android:应用程序在使用处理程序和切换时冻结

时间:2017-05-04 22:05:57

标签: java android loops while-loop

我希望在开关打开时每500毫秒重复一次功能。但是当我运行我的代码时,当我打开电源时,一切都会冻结。这是我的代码:

    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;
            }
        }
    });

1 个答案:

答案 0 :(得分: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始终为true。 它停止响应。

这将解决您的问题:
在sharedPreferences中保存切换状态,并将Runnable发布到活动中的任何位置。仅当sharedPreferences中的值为true时才发送数据。