AsyncTask工作时不显示进度条

时间:2013-09-12 12:23:18

标签: java android android-asynctask android-progressbar

我正在尝试在我的AsyncTask获取数据时显示我的应用程序中的进度条。

为此我试图重建这个SO-Answer("SO: How to show a progress spinner")。

但是当我的AsyncTask结束所有工作已经完成时,我的进度条会显示(并立即被解雇)。一年多以前,“彼得”问了一个类似的答案"here",但没有得到答案。

这是我的AsyncTask。信息:AppActivity是我的应用程序中所有活动的父类。有些包含碎片,有些则没有。有些人使用我的RESTTask

public class RESTTask extends AsyncTask<Void, Void, String> {

  protected AppActivity AppActivity;

  /*
   * Special constructor to pass the activity
   */
  public RESTTask(AppActivity activity) {
    AppActivity = activity;
  }  

  @Override
  protected String doInBackground(Void... params) {
    String resultstring = "";

    // fetch data from a webservice

    return resultstring;
  }


  @Override
  protected void onPreExecute() {

    super.onPreExecute();

    if (AppActivity != null) {
      AppActivity.showDialog();
    }

  }

  @Override
  protected void onPostExecute(String result) {
    super.onPostExecute(result);

    if (AppActivity != null) {
      AppActivity.dismissDialog();
    }

  }

}

我的AppActivity

public class AppActivity extends Activity {

  public ProgressDialog dialog;

  @Override
  protected void onResume() {
    super.onResume();
    dialog = new ProgressDialog(this);
  }

  public void showDialog() {
    this.dialog.setMessage(getString(R.string.Please_wait));
    this.dialog.show();
  }

  public void dismissDialog() {
    if (this.dialog.isShowing()) {
      this.dialog.dismiss();
    }
  }

}  

所以现在我的问题是:如何正确实现进度条,以便在AsyncTask正在执行时显示它,而不仅仅是在它之后?

更新信息:我希望这个例子更清楚地说明什么不能按预期工作:

在我的一项活动中(确切地说是我的一个活动的一个片段)我想调用一个web服务。 Web服务方法需要大约十秒钟才能回答,因为它很复杂。因此,我希望看到从调用Web服务的那一刻开始显示进度条,直到收到答案为止。但是,我在debuging时可以看到以下内容:

  1. 调用onPreExecute并显示对话框,但模拟器仅显示白屏
  2. 调用doInBackground。在eclipse'LogCat中,我看到调用了web服务并处理了结果。屏幕还在。调用web服务时,模拟器仍会显示白屏。
  3. 调用onPostExecute以关闭对话框。在onPostExecute的开头显示最终呈现的屏幕。
  4. onPostExecute恢复后,对话框会闪烁,然后立即关闭。
  5. 希望这有助于理解这个问题。

    编辑:使用leak window - 异常修复错误后更新了源代码。还有更新的问题,希望能让它更清晰。

    [2]:Activity has leaked window that was originally added“SO:泄露窗口异常

2 个答案:

答案 0 :(得分:2)

1。您的onPostExecute() 从未被称为

因为protected String doInBackground(Void... params)

返回字符串

你有protected void onPostExecute(final Boolean success)

所以改为

 @Override
 protected void onPostExecute(String result) {
    super.onPostExecute(result);
    if (this.dialog.isShowing()) {
       this.dialog.dismiss();
      }  
  }

2。您无法在UI part处理/更新 doInBackground()

所以 doInBackground()

中删除以下内容
if (this.dialog.isShowing()) {
      this.dialog.dismiss();
    }  

答案 1 :(得分:1)

onPreExecute()

中显示您的对话框

试试这段代码

class MyTask extends AsyncTask<Void, String, String> {

    @Override
    protected void onPreExecute() {

        super.onPreExecute();
        //display dialog here
        dialog.show();

    }
    @Override
    protected String doInBackground(Void... params) {
        //do your stuff here
        return myString;
    }

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
        //dismiss dialog here
        dialog.dismiss();
    }

}