Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 26 сен 2018, 08:28

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 114 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
 Заголовок сообщения: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 27 июн 2012, 23:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.

В этом уроке:


- сохраняем связь с AsyncTask при повороте экрана




Click here to read this article!

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 22 май 2017, 23:40, всего редактировалось 6 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 01 июл 2012, 03:30 

Зарегистрирован: 29 июн 2012, 03:14
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Привет.

onRetainNonConfigurationInstance - это классный метод. Но не правильнее ли для продолжения АсинкТасков использовать настройки активити: android:configChanges="keyboardHidden|orientation"?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 01 июл 2012, 10:27 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
chivorotkiv писал(а):
android:configChanges="keyboardHidden|orientation"?
Можно, только если Вы не используете разные разметки для разных ориентаций экрана.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 02 июл 2012, 16:04 

Зарегистрирован: 12 янв 2012, 12:38
Сообщений: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Спасибо за урок =)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 05 июл 2012, 17:51 

Зарегистрирован: 29 июн 2012, 03:14
Сообщений: 4
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
KamiSempai писал(а):
chivorotkiv писал(а):
android:configChanges="keyboardHidden|orientation"?
Можно, только если Вы не используете разные разметки для разных ориентаций экрана.


Если я использую разные разметки для разных ориентаций экрана, то задаю новую разметку в методе onConfigurationChanged. При этом onCreate не вызывается, активити продолжает жить своей жизнью.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 16 июл 2012, 11:51 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
Если onProgressUpdate() произойдет во время поворота экрана, будет нехорошо (или вызов этого метода будет отложен до завершения поворота экрана?).
В любом случае, лучше в onProgressUpdate() добавить проверку activity != null, а в link и unlink - synchronized.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 17 июл 2012, 11:13 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Да, проверка activity != null точно не будет лишней, иначе можно нарваться на NullPoniterException.
А synchronized для link и unlink зачем? synchronized защищает метод от одновременного запуска, а у нас тут все последовательно - старое Activity отпустило, новое приняло.

В течение дня немного дополню урок. Попробую написать решение проблемы.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 18 июл 2012, 00:18 

Зарегистрирован: 14 май 2012, 16:18
Сообщений: 372
Благодарил (а): 0 раз.
Поблагодарили: 6 раз.
В общем, если я правильно понял, благодаря Діма и коллективному разуму эту задачу можно решить еще проще:
Достаточно объявить поля mt и tv как static, они станут объектами класса и все будет работать.
Разумеется нужно добавить проверку, чтоб задача не перезапускалась в onCreate, если она уже существует и выполняется.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 19 июл 2012, 10:02 
Аватар пользователя

Зарегистрирован: 14 июл 2012, 09:52
Сообщений: 32
Откуда: Санкт-Петербург
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Здравствуйте. Подскажите пожалуйста. Внутри AsycnTask у меня есть следующий блок кода.

Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. @Override
  2.         protected void onPreExecute() {
  3.                 pd = ProgressDialog.show(MainActivity.this, getResources().getString(R.string.app_name), "Выполняется загрузка данных", true, true);
  4.             pd.setOnCancelListener(new OnCancelListener() {
  5.                 public void onCancel(DialogInterface dialog) {
  6.                     LoadDataTask.this.cancel(true);
  7.                 }
  8.             });
  9.                 super.onPreExecute();
  10.         }


Так вот, если прописать static к Async, то среда ругается на ссылку на ресурсы и на то, что я MainActivity заменяю на activity. Иначе при повороте экрана приложение внезапно завершает свою работу, когда диалоговое окно должно закрыться методом onPostExecute().

Подскажите пожалуйста, как можно решить такую проблему?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 19 июл 2012, 13:05 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
IlyaZh писал(а):
Так вот, если прописать static к Async, то среда ругается на ссылку на ресурсы и на то, что я MainActivity заменяю на activity.

Странно. Может не корректно заменяете?
Так должно работать:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. pd = ProgressDialog.show(activity, activity.getResources().getString(R.string.app_name), "Выполняется загрузка данных", true, true);

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 19 июл 2012, 13:25 
Аватар пользователя

Зарегистрирован: 14 июл 2012, 09:52
Сообщений: 32
Откуда: Санкт-Петербург
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Помогло, спасибо!
Но теперь ещё проблемка.
В коде
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.                 @Override
  2.                 protected Void doInBackground(Void... params) {
  3.                         //boolean result = true;
  4.                         // Загружаем данные о точках
  5.                         try {
  6.                         loadPoints();
  7.                         } catch (Exception e) {
  8.                         Log.e(DEBUG_TAG, "Unexpected failure in XML downloading and parsing", e);
  9.                 }
  10.                         return null;
  11.                 }
  12.                


У меня загружается функция loadPoints(), где идёт парсинг xml данных с помощью xmlpullparser. А затем спарсенные данные отправляются в другую функцию, в которой xml разбирается и на яндекс карту выводятся точки, используя данные из xml - так вот эту функцию нельзя делать статик, ибо тогда ругается на указание "this" в такой конструкции balloon.setOnBallonListener(this);

Как здесь можно поступить? Или где можно почитать подробнее про вынос async за пределы текущей активности..
Или как можно разделить парсинг и разбор?? Сохранять xml данные на sd карту не очень хочется.

Или сделать передачу параметра activiy в каждую из дочерне вызываемых функций?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 19 июл 2012, 17:20 

Зарегистрирован: 16 июл 2012, 07:47
Сообщений: 235
Благодарил (а): 0 раз.
Поблагодарили: 25 раз.
Нe заменяйте вложенный класс вручную.
(Перед рефакторингом сохраните проект для возможного отката)
Если класс анонимный, выполните рефакторинг Refactor/Convert Anonimous Class to Nested...
Затем
Refactor/Move Type to New File...
(Почему-то нет отдельного рефакторинга для конвертации вложенного класса в обычный)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 01 авг 2012, 11:26 

Зарегистрирован: 01 авг 2012, 11:19
Сообщений: 14
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
damager82 писал(а):
Есть еще один способ (кроме static) избежать связки AsyncTask и Activity - просто сделайте ваш класс, наследующий AsyncTask, не внутренним, а отдельно от MainActivity


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 01 авг 2012, 13:25 
Аватар пользователя

Зарегистрирован: 16 июл 2012, 21:37
Сообщений: 439
Благодарил (а): 0 раз.
Поблагодарили: 27 раз.
Wa1deMar писал(а):
damager82 писал(а):
Есть еще один способ (кроме static) избежать связки AsyncTask и Activity - просто сделайте ваш класс, наследующий AsyncTask, не внутренним, а отдельно от MainActivity


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



Не совсем понял, ну да ладно, всё просто как веник

Имеем отдельный класс унаследованный от асинктаска, что6 его вызвать те6е в лю6ом случае нужно создать экземпляр класса
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. MyClass my = new MyClass(конструктор);

в каждой своей активити ты можешь делать новые экземпляры(не зависящие друг от друга), тут всё зависит на сколько твой асинктаск 6удет универсален для выполнения поставленной задачи в конкретной активити =)

_________________
CEO of a company R.id.team


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 17 авг 2012, 12:29 

Зарегистрирован: 17 авг 2012, 12:24
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Есть еще одна маленькая особенность.
После того как наш textView принял конечное значение и при повороте экрана, layout присваивается первоначальное состояние. Как решение, сохранить результат в переменную и проверять в onCreate на null.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 06 ноя 2012, 19:04 

Зарегистрирован: 11 апр 2012, 15:51
Сообщений: 1
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Как я понял android:configChanges="keyboardHidden|orientation" используется как лёгкая "заглушка", при которой всё работает, до тех пор пока кто-то не позвонит или типо того.

Но мучает вопрос, почему вы не использовали для сохранения связку onSaveInstanceState(Bundle outState)/onRestoreInstanceState(Bundle) ?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 15 дек 2012, 01:48 

Зарегистрирован: 11 окт 2012, 23:30
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Цитата:
Есть еще один способ (кроме static) избежать связки AsyncTask и Activity - просто сделайте ваш класс, наследующий AsyncTask, не внутренним, а отдельно от MainActivity.


не пойму зачем мы добавили static или зачем класс делать не внутренним.
ведь работает внутренний класс как со static так и без...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 18 дек 2012, 09:57 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
gera писал(а):
Цитата:
Есть еще один способ (кроме static) избежать связки AsyncTask и Activity - просто сделайте ваш класс, наследующий AsyncTask, не внутренним, а отдельно от MainActivity.


не пойму зачем мы добавили static или зачем класс делать не внутренним.
ведь работает внутренний класс как со static так и без...


Внутренний класс держит ссылку на внешний класс, т.е. на старое никому после поворота экрана не нужное Activity. Держит ссылку, значит держит в памяти. А зачем держать в памяти ненужный объект?

Атрибут static избавляет внутренний класс от этой ссылки.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 22 дек 2012, 19:18 

Зарегистрирован: 30 июл 2012, 13:32
Сообщений: 25
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Делаю по примеру парсинг страницы, но при повороте все равно создается новое активити, может из-за того что передаю ссылку в execute?
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. @Override
  2.         protected void onCreate(Bundle savedInstanceState)
  3.         {
  4.                 super.onCreate(savedInstanceState);
  5.                 setContentView(R.layout.activity_main);
  6.                
  7.                 if (parse != null)
  8.                 {
  9.                 parse = (Parse) getLastNonConfigurationInstance();
  10.                 }
  11.                 else
  12.                 {
  13.                 parse = new Parse();
  14.                 parse.execute(URL);
  15.                 }
  16.         }


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Урок 91. AsyncTask. Поворот экрана
СообщениеДобавлено: 23 дек 2012, 01:02 

Зарегистрирован: 11 окт 2012, 23:30
Сообщений: 9
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Проверяй что вернет getLastNonConfigurationInstance(). Если вернет null, то создай новый объект parse = new Parse().
Если бы ты внимательно читал урок, то заметил бы этот код
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. mt = (MyTask) getLastNonConfigurationInstance();
  2. if (mt == null) {
  3.    mt = new MyTask();
  4.    mt.execute();
  5. }
  6.  


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 114 ]  На страницу 1, 2, 3, 4, 5, 6  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB