我正在创建一个Sms垃圾邮件应用程序,它将用户定义数量的短信发送到特定号码。
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循环。并制作了一个停止按钮,应该终止此循环。任何人都可以帮助如何停止这个循环和应用程序应该进入其初始状态。因为我试过" break" " System.exit(0)"一切。但是msgs并没有停止发送,直到计数器完成。
答案 0 :(得分:2)
您可以定义一个易失性布尔变量,如:
volatile boolean doStop = false;
更改你的循环有额外的检查,如:
for (i = counter; i > 0 && !doStop; i--) {
..
当您点击停止按钮时,您将此变量设置为true,如:
doStop = true;
答案 1 :(得分:1)
当前代码的第一个问题是,一旦你点击了按钮,即使在用户意识到他发送了很多消息之前,也会导致发送大量消息,你需要在每条消息之间引发延迟。
下一个问题是你的应用程序可能会挂起,因为你的应用程序会执行无限循环的发送消息,在单独的线程中执行代码会有所帮助。
要解决这两个问题,您必须将发送短信代码放在一个新线程中(使用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来显示发送短信的数量。
答案 2 :(得分:0)
我认为你的问题并没有退出循环。 Le loop将太快终止 祝酒词一个接一个地展示。你认为你可以停止循环,但循环已经完成。尝试在循环中添加日志消息。
像这样使用Android Log:
Log.d("MyTag", "SMS " + i);
接下来,打开logcat,您可以按&#34; MyTag&#34;。
进行过滤或者你在主线程中进行循环并且你的UI被冻结,因此按钮没有响应。