该按钮处于“冻结状态”,因为 UI 线程在腾出时间去做其他事情之前发送了所有 20 条 SMS。
我会调查AsyncTask。这是Android轻松线程的方式。本质上,您将使用 AsyncTask 在后台生成一个新线程。这释放了 UI 线程,使用户看起来一切正常(没有冻结),而 AsyncTask 在后台使用doInBackground 完成所有工作。然后当任务完成时,使用onPostExecute 通知 UI 它已经完成,并可能告诉用户一些事情。你可以在 onClick 中调用MyAsyncTask.execute(smsDataHere)。
指向 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);
}