进度对话框不会在异步任务中解除

时间:2012-12-07 07:02:42

标签: android

即使在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();
    }
}

5 个答案:

答案 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()方法中。