3

我正在尝试构建一个 SMS 应用程序,只需按一下按钮即可发送 SMS,这部分正在工作,但现在我正在尝试实现垃圾邮件保护。垃圾邮件保护意味着您每 10 秒(或更高)只能发送 1 条短信。

我试过这个:

sentSMS.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {

       Timer timer = new Timer();

       int seconds = 10000;
       timer.schedule(new TimerTask() {
           public void run() {
               processClick();
           }
       }, seconds);

}});

但是当我按下按钮两次短信也发送两次时,这不起作用。

也许制作一个包含用户必须等待的秒数的 toast 也是一个想法,如下所示:

Toast.makeText(getBaseContext(), "Spam protection, wait "+secondstowait,
        Toast.LENGTH_SHORT).show();

这一切都有可能吗?

4

4 回答 4

5

为什么不在第一次单击按钮时获取时间戳,然后比较再次单击按钮的时间,看看差异是否大于分配的时间?

于 2013-08-12T13:45:49.587 回答
2

您需要存储上次单击按钮的时间,然后查看是否已过 10 秒。

long lastTimeSent = 0; //start at 0


sentSMS.setOnClickListener(new OnClickListener() {
public void onClick(View v) {

   if(System.currentTimeMillis() > lastTimeSent + 10000){ //if at least 10 secs has passed from last click
       processClick();
       lastTimeSent = System.currentTimeMillis(); //last time sent is now current time
   }else{
       Toast.makeText(getBaseContext(), "Spam protection, please wait.",
                        Toast.LENGTH_SHORT).show();
   }
}});
于 2013-08-12T13:51:43.060 回答
2

在我看来,更容易做的事情是禁用按钮,并使用内置处理程序(在视图对象上)重新启用按钮。

sentSMS.setOnClickListener(new OnClickListener() {
   public void onClick(View v) {
       final View view = v;
       v.setEnabled(false);
       v.postDelayed(new Runnable(){
            public void run(){
                 view.setEnabled(true);
            }
       }, 1000*10);    
}});
于 2013-08-12T13:52:54.723 回答
0

如果你想向用户显示一条 toast 消息,通知他还剩多少秒,你也必须在计时器调度事件中编写 toast.maketext 代码

使用时间戳不会是更简单的方法,而是会使任务更加困难。

您也可以尝试禁用按钮 onclick 十秒钟,然后在时间段到期后重新启用它。

于 2013-08-12T13:48:16.900 回答