2012-02-01 5 views
0

これは何度も尋ねられてきましたが、問題を抱えているか、何がうまくいくかを考えています。別のメッセージを送信する前に、各メッセージの間に2〜3秒待つ必要があります。私は見て、ハンドラー、タイマー、スレッドスリープを試みたが、私は自分の状況でどちらが最善の使用であるか、またはそれを正しく動作させる方法がわからない。私はまだプログラミングに慣れていないので、簡単に教えてください。送信する前にSMSを遅らせる必要があります

// ---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

コードのBLOBの目的は何ですか?それがあなたの質問に答えるために必要以上のものであれば、それを打ち消してください!また、SMSがユーザー主導のアクションで送られていて、あなたはレート制限を課す必要がありますか? – cdeszaq

+0

@cdeszaqそれについて申し訳ありませんが、私はコードを送信するSMSの部分を表示するようにそれをトリミングしました。ユーザーは、テストのために送信するSMSの量を入力します。デフォルトは10ですが、希望する場合は最大500まで入力できます。私が取り組んでいる問題は、電話番号が高いと電話が一斉に送信して問題を引き起こすことです。私がそれらを2〜3秒間隔で離すことができれば、これを解決するのに役立ちます。 – 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

あなたは、各SMSの間に2秒の遅延を使用する(1つのスレッドは、おそらくあなたが並列に送信しない原因は十分である)ScheduledExecutorServiceスレッドプールを使用してSMSを送信するためのコードでスケジュールメソッドをコールする場合。 呼び出しごとに、遅延パラメータを2秒(0,2,4,6、...)増加させてください。

希望します。

関連する問題