3

我正在尝试在我的应用程序中实现一个进度条,该进度条在我AsyncTask获取数据时显示。

为此,我尝试重建这个 SO-Answer(“SO:如何显示进度微调器”)。

AsyncTask但是当所有工作都完成时,我的进度条会在我的末尾显示(并立即关闭) 。一年多前,“彼得”在“这里”问了一个类似的答案,但没有得到帮助。

这是我的AsyncTask。Info: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执行时显示,而不仅仅是在它之后显示?

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

在我的一项活动中(确切地说是我的一项活动的片段之一)我想调用一个网络服务。webservice-method 需要大约十秒钟的时间来回答,因为它很复杂。所以我希望看到从调用 web 服务的那一刻到收到答案的进度条。但是我在调​​试时可以看到以下内容:

  1. onPreExecute调用并应显示对话框,但模拟器仅显示白屏
  2. doInBackground称为。在 Eclipse中,LogCat我看到调用了 web 服务并处理了结果。画面静止。调用 web 服务时,模拟器仍然显示白屏。
  3. onPostExecute调用以关闭对话框。onPostExecute在最终渲染屏幕的开头显示。
  4. onPostExecute对话框恢复后会闪烁并在此之后立即关闭。

希望这有助于理解问题。

编辑:用leak window-exception 修复错误后更新源代码。还更新了问题,希望能更清楚。

[2]: Activity has leaked window 原来添加的“SO: Leaked window exception

4

2 回答 2

2

1. Your onPostExecute() is Never call

因为你从返回 Stringprotected 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 partdoInBackground()

所以 doInBackground()

if (this.dialog.isShowing()) {
      this.dialog.dismiss();
    }  
于 2013-09-12T12:27:48.040 回答
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();
    }

}
于 2013-09-12T12:45:39.317 回答