如何停止循环



我正在创建一个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循环。并制作了一个停止按钮,用于终止循环。有人能帮助我们停止这个循环吗?应用程序应该处于初始状态。因为我尝试了"破坏"System.exit(0)"所有内容。但是在计数器结束之前,消息不会停止发送。

您可以定义一个不稳定的布尔变量,如:

volatile boolean doStop = false;

改变你的循环有额外的检查,比如:

 for (i = counter; i > 0 && !doStop; i--) {
    ..

当你按下停止按钮时,你将这个变量设置为true,比如:

doStop = true;

当前代码的第一个问题是,一旦单击按钮,就会导致发送大量消息,甚至在用户意识到他发送了那么多消息之前,您就需要在每条消息之间引入延迟。

下一个问题是,你的应用程序可能会挂起,因为你的应用将执行发送消息的无限循环,在单独的线程中执行代码会有所帮助。

要解决这两个问题,您必须将发送短信的代码放在一个新线程中(为此使用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来显示发送的短信数量。

我认为您的问题不是退出循环。Le循环终止得太快
祝酒词一一展示。你认为你可以停止循环,但循环已经完成了。尝试在循环中添加日志消息。

像这样使用Android日志:

Log.d("MyTag", "SMS " + i);

接下来,打开logcat,您可以通过"MyTag"进行过滤。


或者你在主线程中进行循环,UI被冻结,所以按钮没有响应。

相关内容

  • 没有找到相关文章

最新更新