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;
}
}
});
答
问题是你是停留在一个无限循环在这里。
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时发送数据。
您必须将pom设置为false或使用来自** while while循环内的** break。无论如何,你想做什么? – nandsito