Android AsynTask с диалоговым окном отмены - PullRequest
17 голосов
/ 01 апреля 2011

В моем приложении для Android я использую AsynTask с Progress Dialog (Пожалуйста, подождите, войдите в систему ...) для входа пользователя в систему с моей веб-страницей (функция веб-сервиса внутри AsynTask)

Я хочу закрыть диалог прогресса и отменить AsynTask, когда пользователь нажимает кнопку «Назад» на устройстве.

Я не могу найти такой пример для прерывания AsynTask. Я читал об отмене (булево), но я не знаю, как звонить из интерфейса.

Может ли кто-нибудь дать мне идею.

Спасибо

Ответы [ 4 ]

20 голосов
/ 24 марта 2013
    ProgressDialog progressDialog = ProgressDialog.show(ActivityName.this,
            "Title",
            "Message");
    progressDialog.setCancelable(true);
    progressDialog.setOnCancelListener(new OnCancelListener() {

        @Override
        public void onCancel(DialogInterface dialog) {
            // TODO Auto-generated method stub
            // Do something...
        }
    });

Метод setCancelable (true) устанавливает, можно ли отменить диалог с помощью клавиши BACK. Вы можете выполнить коды завершения с помощью метода setOnCancelListener -> onCancel.

9 голосов
/ 01 апреля 2011
public MyActivity extends Activity {


  private MyAsyncTask task;

  public onCreate() {
     task = new MyAsyncTask(); // MyAsyncTask has a progress dialog and dismiss it
     // in an overrided cancel() method 
     task.execute();
  }

  private void handleOnBackButton() {
     task.cancel(true);
  }

Тогда все, что вам нужно, это позвонить handleOnBackButton(), когда пользователь нажимает назад или домой.Вы можете сделать это, используя метод onKeyDown().

5 голосов
/ 01 апреля 2011

Вы просто должны установить свой ProgressDialog отменяемым.И он исчезнет при нажатии кнопки «Назад».Например:

dialog.setCancelable(true);

Вы должны переопределить onBackPressed, чтобы закрыть ProgressDialog, а также отменить AsyncTask

@Override
public void onBackPressed() {
YourAsyncTaskObject.cancel(true);
YourProgressDialog.dismiss();
return;
}
1 голос
/ 25 мая 2012

Я обнаружил, что событие кнопки "Назад" использует ProgressDialog, который имеет значение "show'n", поэтому действие не может действовать при отмене. Мне пришлось добавить слушателя в диалоге:

mProgress = ProgressDialog
        .show(this, getText(R.string.progress_title),
        getText(R.string.progressing), true, true,
        new OnCancelListener() {
            public void onCancel(DialogInterface pd) {
                handleOnBackButton();
            }
        });         

Nevermind.

Я обнаружил, что гораздо удобнее использовать диалоговое управление Activity и добавлять onDismissListener во время onCreateDialog. Слушатель может отменить задачу. Нет необходимости хранить ссылку на диалоговое окно, и это единственное место, которое нам нужно выслушать для отмены пользователя.

...