1

現在、データベースにある 300 以上の番号に一括 SMS を送信するアプリをコーディングしようとしています。

それらをすべて一度に送信すると、アプリが強制的に閉じられ、27/308 のようにしか送信できなかったという問題に直面しています。

for ループを使用して SMS を送信しています。

これは、次のステップに進む前に for ループを 1 ~ 2 秒遅らせることができるこの問題の修正ですか?

現在、私はこのコードを試しましたが、20 秒間しかスリープせず、ステップごとに 20 秒ではなく、一度にすべてのステップを実行します。sendSms メソッドをコメントアウトし、println(); でテストしました。

どんな助けでも大歓迎です。

for (i = 0; i < phoneNumbers.length; i++){
                txtCommand = customIDs[i] + ";" + command + ";&W<";
                if (phoneNumbers[i].length()>0 && txtCommand.length()>0)  {
                    final String Messages = "Phone Number:" + phoneNumbers[i] + " " + "Message:" + txtCommand;
                    myHandler.postDelayed(new Runnable() { 
                        public void run() { 
                            System.out.println(Messages);
                            //sendSMS(phoneNumbers[i], txtCommand);    
                   } 
           }, 20000);
                    }
                else
                    Toast.makeText(getBaseContext(), 
                        "Please enter both phone number and message.", 
                        Toast.LENGTH_SHORT).show();
            }
4

1 に答える 1

1

記述されたコードは、for ループの 20 秒後に実行するためにすべてをキューに入れます。しかし、必要なのは、各タスクが前のタスクから 20 秒後に実行されるようにキューに入れられることです。

遅延にインデックスを掛けてみることができます。

myHandler.postDelayed(
    ...
, (i + 1) * 20000);

または、ループを再帰的に書き直すこともできます。

void queueMessage(final String[] phoneNumber, final int index) {
    if (index < phoneNumber.length) {
      // TODO do your validation here
      myHandler.postDelayed(new Runnable() {
          public void run() {
            // TODO do your work here
            queueMessage(phoneNumber, index + 1);
          }
        }, 20000);
    }
  }

余談ですが、サービスでこのループをまだ実行していない場合は、実行する必要があります。

于 2011-02-07T19:47:42.600 に答える