Кнопка «зависает», потому что поток пользовательского интерфейса отправляет все 20 SMS, прежде чем он освобождается, чтобы заняться другими делами.
Я бы посмотрел на AsyncTask .Это способ Android легко нарезать нить.По сути, что бы вы сделали, это породило новый поток в фоновом режиме с AsyncTask.Это освобождает поток пользовательского интерфейса, так что все выглядит нормально для пользователя (без остановки), в то время как AsyncTask выполняет всю работу в фоновом режиме с doInBackground
.Затем, когда задание выполнено, используйте onPostExecute
, чтобы уведомить пользовательский интерфейс о том, что оно выполнено, и, возможно, что-то сказать пользователю.Вы бы поместили вызов на MyAsyncTask.execute(smsDataHere)
в onClick.
Эта ссылка на AsyncTask довольно проста для простых целей и имеет пример кода.
Я не совсем уверен, почему он отправляет только 16 или около того сообщений, но я сразу вижу, что вам не хватает фигурных скобок, и что они не совсем совпадают с желаемыми.Я бы посмотрел там первым.Кроме того, есть ли причина для второго цикла for
?size
всегда равен 1, поэтому он просто посылает каждое сообщение дважды.
РЕДАКТИРОВАТЬ: Вот пример кода.Я не собираюсь обещать, что это работает в вашем конкретном приложении, но оно покажет вам, как работает AsyncTask, и даст вам отправную точку.Я также попытался исправить любые проблемы с фигурными скобками и сделал небольшую уборку.Я все еще рекомендую просмотреть документацию, чтобы убедиться, что вы понимаете, как она работает.Я надеюсь, что это поможет вам.
public void onClick(View v){
String phoneNo = putpn.getText().toString();
String message = txtMessage.getText().toString();
String txts = txtAmount.getText().toString();
String inter = interval.getText().toString();
if (msgCount > 21){
Toast.makeText(getBaseContext(), "That is too many txts, the max is 20", Toast.LENGTH_SHORT).show();
}
else{
MySmsTask.execute(phoneNo, message, txts, inter);
}
}
private class MySmsTask extends AsyncTask<String, Void, Integer> {
@Override
protected Integer doInBackground(String... messageData) {
int sentCount = 0;
int size = 1;
int delay = Integer.parseInt(messageData[3]);
int msgCount = Integer.parseInt(messageData[2]);
if (phoneNo.length()>0 && message.length()>0){
for (sentCount = 0; sentCount < msgCount; sentCount++) {
for (int i = 0; i < size; i++) {
sendSMS(messageData[0], messageData[1]);
Thread.sleep(delay * 1000);
}
}
}
return sentCount;
}
@Override
protected void onPostExecute(Integer result) {
Toast.makeText(getBaseContext(), "Sent " + sentCount + " messages", Toast.LENGTH_SHORT).show();
}
}
private void sendSMS(String phoneNumber, String message){
PendingIntent pi = PendingIntent.getActivity(this, 0,
new Intent(this, Object.class), 0);
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, null, null);
}