好的,所以我正在创建一个Android应用程序,能够多次发送短信息,并发送消息量之间的间隔。这部分有效,但有时却没有。例如,当我输入20个msgs发送时,它发送16或者更多一点。此外,当我按下按钮时,它会冻结,直到它完成发送SMS的信息。无论如何有人可以告诉我我的代码有什么问题?我已经尝试了一些不能很好地工作的修复程序,并且认为我会在许多失败的尝试之后来这里寻求帮助。 PS那么有更多的代码,但这是问题所在的地方我相信。谢谢阅读 编辑:固定!
答案 0 :(得分:1)
该按钮处于“冻结”状态,因为UI线程在释放其他内容之前正在发送所有20条短信。
我会调查AsyncTask。这是Android轻松推送的方式。基本上你会用AsyncTask在后台生成一个新线程。这释放了UI线程,使其看起来像用户的一切正常(没有冻结),而AsyncTask正在使用doInBackground
在后台完成所有工作。然后,当任务完成时,使用onPostExecute
通知UI它已完成并可能告诉用户一些东西。您将调用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);
}