编程语言
首页 > 编程语言> > java-AsyncTask工作时不显示进度栏

java-AsyncTask工作时不显示进度栏

作者:互联网

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

为此,我尝试重建此SO-Answer(“SO: How to show a progress spinner”).

但是,当所有工作都已经完成时,我的进度条就会显示在AsyncTask的末尾(并立即被关闭). “ Peter”一年多以前曾问过类似的答案“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服务.由于复杂性,webservice方法大约需要十秒钟来回答.因此,我希望从调用Web服务的那一刻开始,直到收到答案为止,都会显示进度条.但是我在调​​试时可以看到以下内容:

>调用onPreExecute并应显示对话框,但仿真器仅显示白屏
>将调用doInBackground.在eclipse的LogCat中,我看到调用了Web服务,并且处理了结果.屏幕静止不动.调用Web服务时,模拟器静止图像会显示白屏.
>调用onPostExecute以关闭对话框.在onPostExecute的开始处,显示最终渲染的屏幕.
>从onPostExecute恢复后,对话框将闪烁并在此后立即关闭.

希望这有助于理解问题.

编辑:修复了泄漏窗口例外的错误后,更新了源代码.还更新了问题,希望可以使其更清楚.

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

解决方法:

1.永远不会调用您的onPostExecute()

因为您从受保护的字符串doInBackground(Void … params)返回了String

并且您已保护void onPostExecute(最终布尔成功)

因此更改为

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

2.您不能在doInBackground()中处理/更新UI部件

因此,请从doInBackground()中删除以下内容

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

标签:android-asynctask,android-progressbar,java,android
来源: https://codeday.me/bug/20191122/2062413.html