2012-02-01 3 views
0

Я знаю, что это задавали несколько раз, но у меня возникают проблемы с его работой или выяснением того, что будет работать лучше всего. Мне нужно, чтобы sms подождал 2-3 секунды между каждым сообщением перед отправкой другого сообщения. Я просмотрел и попробовал обработчики, таймеры и потоки сна, и я не уверен, какой из них лучше всего использовать в моей ситуации или как это сделать правильно. Я все еще новичок в программировании, поэтому, пожалуйста, успокойтесь.Требуется, чтобы смс отложили до отправки

// ---sends an SMS message--- 
private void sendSMS(String phoneNumber, String message) { 

    int i; 
    SmsManager sms = SmsManager.getDefault(); 
    int amount = 10; // just making 10 the default if the EditText has an 
         // invalid value 
    try { 
     amount = Integer.parseInt(smsamount.getText().toString()); 
    } catch (NumberFormatException smsamount) { 
    } 

    if (amount < 501) { 
     for (i = 0; i < amount; i++) { 
     sms.sendTextMessage(phoneNumber, null, message, sentPI, null); 
     } 
+2

Какова цель блоба кода? Если это больше, чем нужно для ответа на ваш вопрос, _trim it down! _ Также, отправляется ли sms инициированное пользователем действие, и вам нужно наложить ограничение по скорости, или это что-то еще? – cdeszaq

+0

@cdeszaq извините, я обрезал его, чтобы он просто показывал отправку sms-части кода. Пользователь вводит количество смс, которое они хотели бы отправить для тестирования. По умолчанию 10, но они могут ввести до 500, если хотите. Проблема, с которой я сталкиваюсь, заключается в том, что если они вводят большое число, телефон пытается отправить их все сразу и вызывает проблемы. Если я смогу разогнать их на несколько секунд, это поможет решить эту проблему. – Jasonwilliams10

ответ

0

Возможно, что-то вроде этого. Я не тестировал его, но идея использования ScheduledExecutorService должна быть тем, что вам нужно.

public class SMS extends Activity { 
    private final static OnClickListener EMPTY_ON_CLICK_LISTENER = new EmptyOnClickListener(); 
    TextView smsamount; 

    // ---sends an SMS message--- 
    private void sendSMS(String phoneNumber, String message) { 
     // just making 10 the default if the EditText has an invalid value 
     int amount = 10; 

     try { 
      amount = Integer.parseInt(smsamount.getText().toString()); 
     } catch (NumberFormatException smsamount) { 
      // Ignore 
     } 

     sendSMS(phoneNumber, message, amount); 
    } 

    // ---sends an SMS message--- 
    private void sendSMS(String phoneNumber, String message, int count) { 
     if (count >= 501) { 
      new AlertDialog.Builder(SMS.this).setTitle("Maximum amount of messages exceeded!") 
        .setMessage("Please enter 500 or less for the amount of messages") 
        .setNeutralButton("Ok", EMPTY_ON_CLICK_LISTENER).show(); 
      // Quit early when we know we can't go any further. 
      return; 
     } 

     String SENT = "SMS_SENT"; 
     PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0); 
     // ---when the SMS has been sent--- 
     registerReceiver(new SmsSentBroadcastReceiver(getBaseContext()), new IntentFilter(SENT)); 

     int delaySeconds = 3; 
     ScheduledExecutorService scheduler = new SmsScheduler().sendSmsMessages(phoneNumber, message, sentPI, delaySeconds, 
       count); 

     // You may cancel the scheduled messages with the scheduler. 
     // scheduler.shutdownNow(); 

     new AlertDialog.Builder(SMS.this).setTitle("Attention!") 
       .setMessage("Your messages will start sending shortly, please do not press the send sms button again") 
       .setNeutralButton("Ok", EMPTY_ON_CLICK_LISTENER).show(); 
    } 

    private static class SmsSentBroadcastReceiver extends BroadcastReceiver { 
     Context context; 

     public SmsSentBroadcastReceiver(Context context) { 
      this.context = context; 
     } 

     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(context, "SMS sent", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Toast.makeText(context, "Generic failure", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Toast.makeText(context, "No service", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Toast.makeText(context, "Null PDU", Toast.LENGTH_SHORT).show(); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Toast.makeText(context, "Radio off", Toast.LENGTH_SHORT).show(); 
       break; 
      } 
     } 
    } 

    private static class EmptyOnClickListener implements OnClickListener { 
     public void onClick(DialogInterface dialog, int which) { 
      // Does nothing 
     } 
    } 

    private static class SmsScheduler { 
     public ScheduledExecutorService sendSmsMessages(final String phoneNumber, final String message, 
       final PendingIntent sentIntent, int count, int delaySeconds) { 
      final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 

      final SmsManager sms = SmsManager.getDefault(); 

      // Create the task that will send a SMS message 
      final Runnable sender = new Runnable() { 
       public void run() { 
        sms.sendTextMessage(phoneNumber, null, message, sentIntent, null); 
       } 
      }; 

      // Schedule the messages to be sent at intervals of delaySeconds. 
      for (int i = 0; i < count; i++) { 
       scheduler.schedule(sender, delaySeconds * i, TimeUnit.SECONDS); 
      } 

      return scheduler; 
     } 
    } 
} 
+0

Это работает, как мне нужно, спасибо. – Jasonwilliams10

2

, если вы хотите использовать задержку 2 секунды между каждыми СМС, использовать пул ScheduledExecutorService нити (1 нить достаточно вероятно, потому что вы не посылать параллельно) и вызовите метод графика с кодом для отправки смс. Для каждого вызова поднимите параметр задержки на 2 секунды (0,2,4,6, ...)

Надеюсь, что это поможет.

Смежные вопросы