Как узнать, был ли диалог уничтожен, закрыт, удален? - PullRequest
0 голосов
/ 27 октября 2018

У меня есть действие, которое открывает настраиваемое диалоговое окно. Это настраиваемое диалоговое окно при создании запускает асинхронную задачу, которая загружает информацию, которая будет отображаться.

Если пользователь закрывает диалоговое окно, действие, приложение или что-либо еще до полной загрузки, я хочу, чтобы асинхронная задача прекратила загрузку.

Вот как я это делаю:

Активность:

new UsernamesListDialog().show(getSupportFragmentManager(), USERNAMES_LIST_DIALOG_TAG);

public class UsernamesListDialog extends AppCompatDialogFragment implements CompoundButton.OnCheckedChangeListener, View.OnClickListener, LoadFollowersTask.LoadFollowersListener {

  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  new LoadFollowersTask(this, this.progressBar, this.progressCaption, APIFacade.getInstance().getLocalUser()).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, APIFacade.getInstance());


        return v;
    }


public class LoadFollowersTask extends AsyncTask<APIFacade, Integer, Set<BasicUser>> {
  protected Set<BasicUser> doInBackground(APIFacade... api) {
     while (loaded.size() < totalToLoad && this.listener.isAlive()) {
//load stuff      
}

return result;

this.listener - это собственный диалог, а метод isAlive():

public boolean isAlive(){
return this.isVisible();
}

Проблема:

Поскольку задачи асинхронные, LoadFollowersTask может попасть в то время, пока диалоговое окно правильно не отобразится в интерфейсе, в этом случае задача остановится сама и вернет пустой результат.

Так что мне нужно переопределить isAlive к чему-то, что будет возвращать true с момента создания диалога до его закрытия

Какой метод мне использовать?

1 Ответ

0 голосов
/ 27 октября 2018

Вам следует попробовать поработать с методами диалога setOnShowListener и setOnDismissListener. Вы можете получить объект Dialog при вызове getDialog() внутри onViewCreated вашего класса UsernamesListDialog.

OnShowListener вызывается, когда отображается диалог, поэтому вы можете запустить там AsyncTask. OnDismissListener вызывается, когда диалог закрывается, поэтому вы можете отменить любой незаконченный AsyncTask.

...