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 サービスが呼び出された瞬間から応答が受信されるまで、プログレス バーが表示されることを期待しています。しかし、デバッグ中に私が見ることができるのは次のとおりです。
- が呼び出され、
onPreExecute
ダイアログが表示されるはずですが、エミュレーターには白い画面しか表示されません - と
doInBackground
呼ばれます。Eclipse ではLogCat
、Web サービスが呼び出され、結果が処理されることがわかります。画面は静止しています。Web サービスを呼び出すと、エミュレーターはまだ白い画面を表示します。 - ダイアログを閉じるために
onPostExecute
が呼び出されます。onPostExecute
最終的にレンダリングされた画面の最初に表示されます。 - ダイアログから再開した後
onPostExecute
、点滅し、その後すぐに閉じられます。
これが問題の理解に役立つことを願っています。
leak window
編集: -exceptionでエラーを修正した後、ソース コードを更新しました。うまくいけば、それをより明確にするための質問も更新されました。
[2]:アクティビティが最初に追加されたウィンドウをリークしました"SO: リークされたウィンドウの例外