我有一个应用程序,我想要执行以下操作:
问题是这种情况发生了:
Web服务在AsyncTask中执行,其中进度对话框显示在onPreExecute()方法中,并在onPostExecute()方法中被解除:
public class WebService extends AsyncTask<Void, Void, Boolean> {
public void onPreExecute() {
_progressDialog = ProgressDialog.show(_context, "", message);
}
protected Boolean doInBackground(Void... params) {
try {
// Execute web service
}
catch (Exception e) {
e.printStackTrace();
}
return true;
}
protected void onPostExecute(Boolean result) {
_progressDialog.hide();
}
}
执行Web服务和显示对话框的代码:
WebService ws= new WebService();
ws.execute();
// Web service saves retrieved list in local db
// Retrieve list from local db
AlertDialog.Builder db = new AlertDialog.Builder(context);
db.setTitle("Select an Item");
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(context,
android.R.layout.simple_selectable_list_item, list);
db.setAdapter(listAdapter, null);
db.show();
我是否需要在代码中添加一些内容以确保在列表选择对话框之前显示进度对话框?
提前谢谢。
答案 0 :(得分:0)
我是这样做的:
public OnClickListener loginListener = new OnClickListener() {
public void onClick(View v) {
ProgressDialog progressDialog = new ProgressDialog(activity);
progressDialog.setMessage("Logging in...");
LoginTask loginTask = new LoginTask(activity, progressDialog, loginLayout, loggedInLayout);
loginTask.execute();
}
};
asynctask:
protected void onPreExecute() {
progressDialog.show();
}
protected void onPostExecute(Integer responseCode) {
if (responseCode == 1) {
progressDialog.dismiss();
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(activity.getApplicationContext(), "Logged in.", duration);
toast.show();
activity.bar.getTabAt(0).setText(dbHandler.getUserDetails().get("email"));
因此,我实际上在主要活动中创建了ProgressDialog,并在我甚至声明/执行任务之前设置了它的消息。然后,任务显示并解散(不隐藏)对话框。
让我知道这是否有效!
答案 1 :(得分:0)
我遇到了同样的问题。我试图在任务之前使用runOnUiTask runnable使用post runnable显示Progress对话框。什么都没做 工作完成后,对话框始终显示,或根本没有显示。
我刚刚找到的解决方案,它对我有用,证明是将 doInBackground 代码放入 try {} catch {} 块。
不要问我为什么会这样。我的结论是Android Os设计中的某些内容是错误的,它阻止了Messahe处理程序在某些情况下调度消息。并且不知何故try / catch为处理程序提供制动并且消息被分派。
注意:即使我的代码没有抛出任何异常,我使用了try / catch块,只是使用了
try {
// code
}
catch( Exception e) { }