Android - проблемы с многоуровневой цепочкой действий - PullRequest
6 голосов
/ 17 октября 2011

(Обратите внимание, что я искал в Интернете предупреждения, которые я описываю ниже, и почти ничего не нашел о них.)

Я работаю с API уровня 10. У меня есть экран настроек (на основе XML), и один из вариантов там создает настраиваемую ListActivity следующим образом:

  • PreferenceActivity содержит параметр, который создает ...
    • ListActivity , это диалог, который использует ...
      • setOnClickListener () , который содержит метод onClick (), который ( непосредственно перед вызовом finish () ) запуститActivity () новый Intent ...
        • подвид деятельности , который запускает ...
          • AsyncTask , который выполняет работу с переменным временем, которая по завершении вызывает ...
          • onPostExecute () , который вызывает метод finish ()

Дело в том, что это работает ... но я получаю массу предупреждений, начиная с:

10-16 21:59:25.010: WARN/WindowManager(170): Rebuild removed 4 windows but added 3
10-16 21:59:25.010: WARN/WindowManager(170): This window was lost:.....

Любопытно, что эта масса предупреждений появляется ТОЛЬКО, когда задача выполняется быстро! Когда я добавил в свой AsyncTask вызов Thread.sleep () для искусственного раздувания времени выполнения, он работал и не выдавал никаких предупреждений. На самом деле, до тех пор, пока для его запуска требуется более (примерно) 500 мс, он работает нормально. (Обратите внимание, что я попытался использовать startActivityForResult (), чтобы добиться большего эффекта - такая же проблема возникает.)


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

Бьюсь об заклад, это состояние гонки ... порядок, в котором разрушаются окна, варьируется в зависимости от этого времени выполнения ... и у меня складывается впечатление, что когда дочерняя активность закрывается до своего родительского ListActivity, появляются предупреждения быть брошенным. Но добавление сна в 1 с () не является разумным решением, если только это не какая-то ошибка в Android (маловероятно, но опять же, я уже воспроизвел пару таких ошибок сегодня).

Итак, какой недостаток в этом моем, который приводит к этому потоку предупреждений? Было бы неплохо сказать «по предпочтению, сделай это, затем сделай это, затем закончи», но я думаю, что Я делаю это эквивалентно. Может быть, нет ... мысли?


Редактировать: я решил попробовать сделать ListActivity как собственный диалог ... это было одной из самых болезненных вещей, которые я пытался сделать в последнее время (getApplication () не работает, и многие другие вещи, кажется, идут неправильно ... это может быть в некоторой степени неопытно, но диалоги для этого тоже не предназначены ...

1 Ответ

4 голосов
/ 09 ноября 2011

Попробуйте выполнить следующие две вещи:

  • Закройте свой диалог перед вызовом finish () для родительского действия (PreferenceActivity).

  • Makeуверен, что вы запускаете AsyncTask позже в жизненном цикле подоперации.Я специально думаю, что вы должны запустить его в onResume ().

Мое лучшее предположение состоит в том, что AsyncTask вызывает финиш () для подэтапа до того, как подэтапбыл шанс полностью запустить.Почему это имеет значение?Я не уверен.Что-то попробовать, хотя.Удачи!

...