Android 如何等待AsyncTask中发送的确认短信?
我正在尝试在AsyncTask中发送几条消息,并希望跟踪已发送消息的进度。感谢@cYrixmorten在这个主题上发表的精彩文章,我已经完成了我想做的大部分事情。这是我的密码:Android 如何等待AsyncTask中发送的确认短信?,android,android-asynctask,broadcastreceiver,smsmanager,Android,Android Asynctask,Broadcastreceiver,Smsmanager,我正在尝试在AsyncTask中发送几条消息,并希望跟踪已发送消息的进度。感谢@cYrixmorten在这个主题上发表的精彩文章,我已经完成了我想做的大部分事情。这是我的密码: @Override public void onCreate(Bundle savedInstanceState) { sentReceiver = new BroadcastReceiver() { @Override public voi
@Override
public void onCreate(Bundle savedInstanceState) {
sentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent in) {
switch (getResultCode()) {
case Activity.RESULT_OK:
break;
default:
break;
}
}
};
getActivity().registerReceiver(sentReceiver, new IntentFilter(
SENT));
}
public class SomeAsyncTask extends
AsyncTask<ArrayList<Person>, Integer, Void> {
private ProgressDialog dialog;
private Context context;
public SomeAsyncTask(Activity activity) {
context = activity;
dialog = new ProgressDialog(context);
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
}
protected void onPreExecute() {
this.dialog.show();
}
@Override
protected Void doInBackground(ArrayList<Person>... params) {
dialog.setMax(params[0].size());
SmsManager mySMS = SmsManager.getDefault();
for (int i = 0; i < params[0].size(); i++) {
Intent sentIn = new Intent(SENT);
PendingIntent sentPIn = PendingIntent.getBroadcast(context,
i, sentIn, 0);
mySMS.sendTextMessage(params[0].get(i).getNum(),
null, message, sentPIn, null);
// HERE I NEED TO WAIT TO RECEIVE CONFIRMATION THAT MESSAGE IS SENT AND
// THEN I CAN PUBLISH PROGRESS. HOW TO DO THAT RESULT IN onReceive() IN BroadcastReceiver()?
publishProgress((int) ((i / (float) params[0].size()) * 100));
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
dialog.setProgress(values[0]);
}
@Override
protected void onPostExecute(Void v) {
}
}
@覆盖
创建时的公共void(Bundle savedInstanceState){
sentReceiver=新广播接收器(){
@凌驾
接收时公共无效(上下文c,意图中){
开关(getResultCode()){
案例活动。结果\u正常:
打破
违约:
打破
}
}
};
getActivity().registerReceiver(sentReceiver,新的IntentFilter(
),;
}
任务扩展的公共类
异步任务{
私人对话;
私人语境;
公共任务(活动){
上下文=活动;
dialog=新建进度对话框(上下文);
设置ProgressStyle(ProgressDialog.STYLE_水平);
}
受保护的void onPreExecute(){
this.dialog.show();
}
@凌驾
受保护的Void doInBackground(ArrayList…params){
dialog.setMax(参数[0].size());
SmsManager mySMS=smsmsmanager.getDefault();
对于(int i=0;i
我在代码中添加了解释。所以,在我继续发送其他消息之前,我需要知道消息是否已发送。实现这一点的最佳方法是什么?您必须为发送的意图过滤器注册一个广播接收器,在那里您可以获得发送消息的事件。以布尔值为例
bool isMessageSent= false;
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
// set boolean here to true
isMessageSent = true;
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
// handle your result
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
// handle your result
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
// handle your result
break;
default:
// handle your result
break;
}
}
}, new IntentFilter(SENT));
现在,在doInBackground方法中,添加while循环作为
while(!isMessageSent) {
}
当消息将被发送时,此循环将被终止,下一条消息将被发送。可能需要将一些全局标志设置为
false
,然后等待onReceive
将其设置为true
?@user330486,它可以工作!我设置了一个全局布尔变量,并在AsyncTask中放置了一个无限“while”循环,只有在“onCreate()”中将该布尔变量设置为“true”时,该循环才会退出。如果消息从未发送,这将以无限循环结束。@GaneshKrishnan不仅如此,建议的while()
循环是一个紧密的循环。最后,室内应该有一个100毫秒左右的睡眠时间。