我如何停止循环
How do i stop loop
我正在创建一个垃圾短信应用程序,它将向特定号码发送用户定义数量的短信。
for (i = counter; i > 0; i--) {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
Toast.makeText(getApplicationContext(), +i + " SMS Remaining", Toast.LENGTH_LONG).show();
}
所以我使用了一个for循环。并制作了一个应该终止此 for 循环的停止按钮。任何人都可以帮忙解决如何停止这个 for 循环并且应用程序应该进入其初始状态。因为我尝试了 "break" "System.exit(0)" 一切。但是在计数器完成之前消息不会停止发送。
您可以定义一个 volatile 布尔变量,例如:
volatile boolean doStop = false;
并改变你的循环有额外的检查,如:
for (i = counter; i > 0 && !doStop; i--) {
..
当您点击停止按钮时,您将此变量设置为 true,例如:
doStop = true;
我认为你的问题不是退出循环。 Le 循环将终止得太快。
祝酒词一一出示。你认为你可以停止循环,但循环已经完成。尝试在循环中添加一条日志消息。
像这样使用Android Log:
Log.d("MyTag", "SMS " + i);
接下来,打开 logcat,您可以按 "MyTag" 筛选。
或者您在主线程中进行循环,然后 UI 被冻结,因此按钮没有响应。
当前代码会遇到的第一个问题是,一旦您单击按钮,它会导致发送大量消息,甚至在用户意识到他发送了那么多消息之前,您需要在每个消息之间引入延迟留言。
下一个问题是您的应用程序可能会挂起,因为您的应用程序将执行发送消息的无限循环,在单独的线程中执行代码会有所帮助。
要解决这两个问题,您必须将发送短信代码放在一个新线程中(为此使用AsyncTask
)并在每条消息发送后引入延迟,并在延迟后检查是否停止按钮被点击。
下面是执行此操作的代码:
class SendSMS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
while (!dostop) { //if stop button is clicked stop the loop
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
Toast.makeText(getApplicationContext(), +i + " SMS Remaining", Toast.LENGTH_LONG).show(); Thread.sleep(5000);
}
} catch (Exception e) {
}
return null;
}
}
用法:点击发送短信按钮后调用上述代码。
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dostop = false; //set to false first
new SendSMS().execute();
}
}
);
单击停止按钮时需要设置一个变量dostop=true
。
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dostop = true;
}
});
我还建议添加一些 UI 以显示发送的短信数。
我正在创建一个垃圾短信应用程序,它将向特定号码发送用户定义数量的短信。
for (i = counter; i > 0; i--) {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
Toast.makeText(getApplicationContext(), +i + " SMS Remaining", Toast.LENGTH_LONG).show();
}
所以我使用了一个for循环。并制作了一个应该终止此 for 循环的停止按钮。任何人都可以帮忙解决如何停止这个 for 循环并且应用程序应该进入其初始状态。因为我尝试了 "break" "System.exit(0)" 一切。但是在计数器完成之前消息不会停止发送。
您可以定义一个 volatile 布尔变量,例如:
volatile boolean doStop = false;
并改变你的循环有额外的检查,如:
for (i = counter; i > 0 && !doStop; i--) {
..
当您点击停止按钮时,您将此变量设置为 true,例如:
doStop = true;
我认为你的问题不是退出循环。 Le 循环将终止得太快。
祝酒词一一出示。你认为你可以停止循环,但循环已经完成。尝试在循环中添加一条日志消息。
像这样使用Android Log:
Log.d("MyTag", "SMS " + i);
接下来,打开 logcat,您可以按 "MyTag" 筛选。
或者您在主线程中进行循环,然后 UI 被冻结,因此按钮没有响应。
当前代码会遇到的第一个问题是,一旦您单击按钮,它会导致发送大量消息,甚至在用户意识到他发送了那么多消息之前,您需要在每个消息之间引入延迟留言。
下一个问题是您的应用程序可能会挂起,因为您的应用程序将执行发送消息的无限循环,在单独的线程中执行代码会有所帮助。
要解决这两个问题,您必须将发送短信代码放在一个新线程中(为此使用AsyncTask
)并在每条消息发送后引入延迟,并在延迟后检查是否停止按钮被点击。
下面是执行此操作的代码:
class SendSMS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
while (!dostop) { //if stop button is clicked stop the loop
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
Toast.makeText(getApplicationContext(), +i + " SMS Remaining", Toast.LENGTH_LONG).show(); Thread.sleep(5000);
}
} catch (Exception e) {
}
return null;
}
}
用法:点击发送短信按钮后调用上述代码。
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dostop = false; //set to false first
new SendSMS().execute();
}
}
);
单击停止按钮时需要设置一个变量dostop=true
。
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dostop = true;
}
});
我还建议添加一些 UI 以显示发送的短信数。