現在のコードで発生する最初の問題は、ボタンをクリックすると、ユーザーが多くのメッセージを送信したことに気付く前に大量のメッセージが送信されることになり、各メッセージ間に遅延を誘発する必要があることです。
次の問題は、アプリがメッセージ送信の無限ループを実行するため、アプリがハングする可能性があることです。別のスレッドでコードを実行すると役立ちます。
これら 2 つの問題を解決するには、送信 SMS コードを新しいスレッドに配置し (そのために使用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;
}
}
使用法: SMS の送信ボタンがクリックされた後、上記のコードを呼び出します。
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;
}
});
また、送信された SMS の数を表示する UI を追加することをお勧めします。