【问题标题】:How do i stop loop我如何停止循环
【发布时间】:2015-05-09 00:20:42
【问题描述】:

我正在创建一个短信垃圾邮件应用程序,它将用户定义的短信数量发送到特定号码。

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 循环,并且应用程序应该进入其初始状态。因为我尝试了“打破”“System.exit(0)”的一切。但是在计数器完成之前,消息不会停止发送。

【问题讨论】:

    标签: android loops terminate android-looper


    【解决方案1】:

    您可以定义一个 volatile 布尔变量,例如:

    volatile boolean doStop = false;
    

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

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

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

    doStop = true;
    

    【讨论】:

    • 你打字比我快,说得好。
    • 这不会在用户意识到之前就发送大量短信吗......我会考虑在每个短信之间添加一个延迟,然后检查 doStop 是否为真,如果为真那么停止其他继续发送
    • @Ranjith 我同意,这只是一种暗示。 Maaz 你能更新你问题中的代码修改吗?
    • @Ranjith 你能详细说明一下吗?
    • @Maaz 我已经在我的回答中详细说明了。
    【解决方案2】:

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

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

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

    【讨论】:

    • 非常感谢它真的帮了很多忙:)
    【解决方案3】:

    我认为您的问题不在于退出循环。 Le 循环将终止太快。
    敬酒一一显示。你认为你可以停止循环,但循环已经完成。尝试在循环中添加一条日志消息。

    像这样使用Android Log

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

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


    或者您在主线程中创建循环并且您的 UI 被冻结,因此按钮没有响应。

    【讨论】:

    • 正是我的问题。您能详细说明如何添加日志消息吗?
    猜你喜欢
    • 1970-01-01
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2014-05-30
    • 2010-09-26
    • 2012-06-19
    • 2019-07-01
    相关资源
    最近更新 更多