Почему диалоговое окно прогресса все еще отображается, а текущая асинхронная задача ожидает предыдущей асинхронной задачи?

Я запускаю службу при входе пользователя в систему, которая позволяет загружать множество вложений в фоновом режиме с помощью AsyncTask.

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

В книжной ориентации у меня есть еще одна функция для вычисления некоторых данных в фоновом режиме с помощью AsyncTask. Эта функциональность содержит следующий код:

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(getActivity());
        pDialog.setMessage("Calculating...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Integer doInBackground(Integer... args) {
        //Some data processing

    }

    @Override
    protected void onPostExecute(Integer file_url) {
        super.onPostExecute(file_url);

        if(pDialog.isShowing()) {
            pDialog.dismiss();
            pDialog.cancel();
        }

    }

Проблема в том,

Когда я поворачиваю устройство в портретную ориентацию -

1) Диалоговое окно прогресса никогда не закрывается, пока я не перезапущу/не перезапущу приложение.

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

3) Когда вычисление асинхронных данных завершается, портретный макет заполняется этими рассчитанными данными, но диалоговое окно прогресса не закрывается до перезапуска приложения.


person My God    schedule 31.03.2014    source источник
comment
когда действие было уничтожено, ссылка pDialog была уничтожена, и она была воссоздана. Я сделал AsyncTask ссылкой на несуществующую переменную.   -  person tyczj    schedule 31.03.2014


Ответы (2)


Вы должны помнить, что при изменении ориентации ваши ресурсы перераспределяются и создаются заново (поскольку сам Activity уничтожается).

На сайте Android Developer есть некоторая информация об этом, вы можете посмотреть эту конкретную тему здесь.

person DigCamara    schedule 31.03.2014

Это решается с помощью статического внутреннего Handler для фоновой обработки данных.

Следующий код работал отлично -

(Книжная ориентация)

static class BoardHandler extends Handler {
    private final WeakReference<BoardFragment> mService; 

    BoardHandler(BoardFragment service) {
    mService = new WeakReference<BoardFragment>(service);
    }

    @Override
    public void handleMessage(Message msg)
    {
    BoardFragment service = mService.get();
     if (service != null) {
          service.summaryData(msg);

          if(pDialog != null && pDialog.isShowing())
          pDialog.dismiss();
     }
    }
}

public void displayChart(final int maxDays) {

    BoardHandler myHandler = new BoardHandler(this);

    myHandler.sendEmptyMessage(maxDays);

}


 public void summaryData(Message msg)
 {
    //Data processing goes here.
 }

Обратите внимание, как использование WeakReference внутри внутреннего класса Handler помогло не только устранить утечки памяти, но и показать диалоговое окно прогресса.

Процесс отображения диалогового окна «Progess» выполняется при добавлении фрагмента в стопку и выполнении фиксации в действии, тогда как диалоговое уничтожение вызывается после того, как summaryData method завершает свое выполнение.

Это может помочь тому, кто считает дни на решение подобных проблем.

person My God    schedule 01.04.2014