即使在onPostExecute()中运行了progressDialog.dismiss,AsyncTask中的进度对话框也不会被忽略。
我已经尝试在SO上实现了很多关于相关问题的答案,到目前为止没有成功。
我确信我必须忽略一些非常基本的东西,但我被困住了。
任何指向解释和代码段的指针都会很棒,谢谢。
主要
public class Main extends Activity {
String result;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
asyncTask task = new asyncTask("Loading ...", this);
try {
result = task.execute("Question").get();
}
catch (Exception e) {
Log.e("Error: ", e.toString());
}
}
}
的AsyncTask
public class asyncTask extends AsyncTask<String, Void, String> {
private ProgressDialog progressDialog;
private String message;
private Context context;
public asyncTask(String msg, Context ctx) {
this.context = ctx;
message = msg;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(context);
progressDialog.show(context, "", message, true, false);
}
@Override
protected String doInBackground(String... params) {
int count = 100000;
for (int i = 0; i < count; i++) {
// waste time
}
return "Answer";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progressDialog.dismiss();
}
}
答案 0 :(得分:9)
其实你在做:
progressDialog.show(context, "", message, true, false);
相反它应该是:
progressDialog = ProgressDialog.show(context, "", message, true, false);
您必须静态调用show方法并将其分配给progressDialog
答案 1 :(得分:2)
在onPostExecute
@Override
protected void onPostExecute(String result) {
try{
if(progrssDialog.isShowing()){
progressDialog.dismiss();
}
}
catch(Exception e){
e.printStackTrace();
}
finally
{
progressDialog.dismiss();
}
}
答案 2 :(得分:2)
我发现的一个常见问题是可变范围。 大多数情况下,ProgressDialog将在Method中定义,该方法不能在该方法之外访问。
你需要像这样声明它,
Public Class MainActivity extends Activity {
ProgressDialog progressDialog;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private class asyncTask extends AsyncTask<String, Void, String> {
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
progressDialog.dismiss();
}
}
答案 3 :(得分:1)
替换
task.execute("Question").get();
与
task.execute("Question");
致电.get()
,迫使main thread
等待。它会/可以挂起你的用户界面。
答案 4 :(得分:-3)
progressDialog.dismiss();
在返回语句之前将它放在doInBackground()方法中。