【问题标题】:Progress bar is not shown while AsyncTask is workingAsyncTask 工作时不显示进度条
【发布时间】:2013-09-16 20:02:52
【问题描述】:

我正在尝试在我的应用程序中实现一个进度条,当我的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 正在执行而不只是在它之后显示它?

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

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

  1. 调用onPreExecute 并显示对话框,但模拟器只显示白屏
  2. doInBackground 被调用。在eclipse'LogCat中看到调用了webservice并处理了结果。画面静止。调用网络服务时,模拟器仍然显示白屏。
  3. 调用onPostExecute 来关闭对话框。在onPostExecute 的开头显示最终渲染的屏幕。
  4. onPostExecute 恢复后,对话框会闪烁,然后立即关闭。

希望这有助于理解问题。

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

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

【问题讨论】:

  • 查看这篇文章:stackoverflow.com/questions/3821423/…。它对我来说效果很好。
  • doInBackground 方法中没有返回字符串,doInBackground 中无法处理 UI。
  • @st.检查了它,它对我没有帮助:/
  • leaked window 问题解决后更新了我的问题,并添加了一些关于我的问题的信息以使其更清晰。

标签: java android android-asynctask android-progressbar


【解决方案1】:

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 in doInBackground()

所以doInBackground()删除关注

if (this.dialog.isShowing()) {
      this.dialog.dismiss();
    }  

【讨论】:

  • 感谢onPostExecute 的通知。我对此进行了更改,因此其中一个问题(leaked windows-exception)已经消失。但是进度条仍然会弹出并在AsynchTask 工作结束时立即消失。你对此也有什么想法吗?
【解决方案2】:

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

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    相关资源
    最近更新 更多