【发布时间】:2016-01-26 14:49:36
【问题描述】:
我知道以下可能不是最佳做法,不建议这样做。
我有一个向服务器发送数据的 AsyncTask。我需要做的整个过程包括快速连续使用此 AsyncTask 的 4 个 Web 调用。
我了解使用 AsyncTask 必须在 OnPreExecute 和 OnPostExecute 中启动和停止 ProgressDialog。我通常会这样做。
问题是我一个接一个地连续调用 4 个 AsyncTask,所以我不希望 4 个进度对话框一个接一个地重复。
我使用 AsyncTask.execute().get(),所以它们是按顺序调用的。
我从 optionsMenu 循环调用这些 AsyncTask。我要做的是设置一个全局 ProgressDialog,我可以在循环之前在 optionsMenu 中启动它并在循环之后取消它。
问题是它没有显示。我想可能是因为它需要在 UI 线程上运行,所以我将它放在了一个 Handler 中,但仍然没有运气。
如何在 optionsMenu 中显示进度对话框?
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menuclientassessment, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.sendclientassessment:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
progressDialog2 = new ProgressDialog(ClientAssessmentActivity.this);
progressDialog2.setTitle("Connecting to Server");
progressDialog2.setMessage("Sending the assessment to server...");
progressDialog2.setIndeterminate(true);
try {
progressDialog2.show();
} catch(Exception e){
//ignore
}
}
});
for(int i = 0; i < arr.size(); i++) {
String [] params = new String[6];
AssessmentScore as = null;
as = arr.get(i);
params[0] = clientID;
params[1] = carerID;
params[2] = comments.getText().toString();
DateTime now = new DateTime();
DateTimeFormatter df = DateTimeFormat.forPattern("yyyy-MM-dd'T'H:mm");
String formattedNowTime = df.print(now);
params[3] = formattedNowTime;
params[4] = as.getElementID();
params[5] = as.getValue();
AsyncSendAssessment asa = null;
asa = new AsyncSendAssessment();
try {
asa.execute(params).get();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}//end of loop
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
try {
progressDialog2.dismiss();
} catch(Exception e) {
//ignore
}
}
});
return true;
default:
return super.onOptionsItemSelected(item);
}
}
【问题讨论】:
标签: android android-asynctask progressdialog android-optionsmenu