1

アプリでAsyncTaskの進行状況ダイアログに問題があります。AsyncTaskインターネットからデータを取得しています。doInBackGround()で進行状況ダイアログを開始しonPreExecute()、でダイアログを終了してい onPostExecute()ます。

ボタンをクリックすると、このasyncTaskを実行します。初めてこのボタンをクリックすると(長時間の操作が行われます)、進行状況ダイアログが表示されません。ただし、次回は[進行状況]ダイアログが正常に表示されます。

初回実行時AsyncTaskに進行状況ダイアログが表示されない問題は何でしょうか?

これはonClickメソッドです:

public void onClickFind(View view){
 new Task_Search().execute();
}

これはタスクTask_Searchです:

private class Task_Search extends AsyncTask<Void, Void, Void> {

 @SuppressWarnings("deprecation")
 protected void onPreExecute() {
  showDialog(DIALOG_TASKING);
 }

 protected Void doInBackground(Void... unused) {
  //some geting of web content here
 }

 @SuppressWarnings("deprecation")
 protected void onPostExecute(Void unused) {
  dismissDialog(DIALOG_TASKING);
 }
}

で定義された進行状況ダイアログMainActivity

@SuppressWarnings("deprecation")
@Override
protected Dialog onCreateDialog(int id) {
 switch (id) {
 case DIALOG_TASKING:
  mSearchDialog = new ProgressDialog(this);
  mSearchDialog.setMessage("Searching for field number..");
  mSearchDialog.setCancelable(true);
  return mSearchDialog;
  }
 return super.onCreateDialog(id);
}

使用する前は、AsyncTask代わりに別のスレッドを使用してデータをダウンロードしていました。ではonClick、最初progressDialogにスレッドを開始し、スレッドが終了したときにもprogressDialog停止しました。動作は同じでした。ボタンダイアログの最初のクリックは表示されず、次に表示されました。

助けることができる人はいますか?

4

3 に答える 3

0

ダイアログで show() を呼び出しているのが見えません。

交換

@SuppressWarnings("deprecation")
protected void onPreExecute() {
    showDialog(DIALOG_TASKING);
}

@SuppressWarnings("deprecation")
protected void onPreExecute() {
    showDialog(DIALOG_TASKING).show();
}
于 2012-11-07T15:29:23.103 に答える
0

さて、MainActivity で独自のメソッドを作成しました。

public void showProgressDialog() {
 if (mProgressDialog == null) {
  mProgressDialog = new ProgressDialog(this);
  mProgressDialog.setMessage("Searching for field number..");
  mProgressDialog.show();
  return;
 }else{
  mProgressDialog.setMessage("Searching for field number..");
  mProgressDialog.show();
  return;
 }

}

また:

public void closeProgressDialog() {
 if (mProgressDialog != null) {
  mProgressDialog.dismiss();
 }
 return;
}

AsyncTask を次のように変更しました。

private class Task_Search extends AsyncTask<Void, Void, Void> {
 protected void onPreExecute() {
  // showDialog(DIALOG_TASKING);
  showProgressDialog();
 }

 protected Void doInBackground(Void... unused) {
 //Some long duration stuff here
 }

 protected void onPostExecute(Void unused) {
  //dismissDialog(DIALOG_TASKING);
  closeProgressDialog();
 }
}

mProgressDialogMainActivity のプライベート メンバーです

private ProgressDialog mProgressDialog;

状況は同じです: ボタンの onClick: 初めて ProgressDialog がスタックし、次回は完全に動作します

于 2012-11-07T16:04:36.363 に答える
0

onPreExecute() 内で showDialog を呼び出さないでください。AsyncTask は、UI スレッドで更新を公開するために doInBackground() から呼び出すことができる publishProgress() メソッドを提供します。

于 2012-11-07T15:30:32.623 に答える