3

AsyncTaskデータのフェッチ中に表示される進行状況バーをアプリケーションに実装しようとしています。

このために、この SO-Answer を再構築しようとしました ( 「SO: プログレス スピナーを表示する方法」 )。

AsyncTaskしかし、私のプログレスバーは、すべての作業がすでに完了しているときに、私の最後に表示されます (そしてすぐに閉じられます) 。"Peter"は 1 年以上前に"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が実行されている間だけでなく、実行中に表示されるようにする方法は?

更新された情報: この例により、何が期待どおりに機能しないかが明確になることを願っています:

私のアクティビティの 1 つ (私のアクティビティの 1 つのフラグメントの 1 つに正確) で、Web サービスを呼び出したいと考えています。webservice-method は複雑なため、応答に約 10 秒かかります。したがって、Web サービスが呼び出された瞬間から応答が受信されるまで、プログレス バーが表示されることを期待しています。しかし、デバッグ中に私が見ることができるのは次のとおりです。

  1. が呼び出され、onPreExecuteダイアログが表示されるはずですが、エミュレーターには白い画面しか表示されません
  2. doInBackground呼ばれます。Eclipse ではLogCat、Web サービスが呼び出され、結果が処理されることがわかります。画面は静止しています。Web サービスを呼び出すと、エミュレーターはまだ白い画面を表示します。
  3. ダイアログを閉じるためにonPostExecuteが呼び出されます。onPostExecute最終的にレンダリングされた画面の最初に表示されます。
  4. ダイアログから再開した後onPostExecute、点滅し、その後すぐに閉じられます。

これが問題の理解に役立つことを願っています。

leak window編集: -exceptionでエラーを修正した後、ソース コードを更新しました。うまくいけば、それをより明確にするための質問も更新されました。

[2]:アクティビティが最初に追加されたウィンドウをリークしました"SO: リークされたウィンドウの例外

4

2 に答える 2

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();
    }  
于 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 に答える