- Как обновить активити android
- Асинхронные операции и пересоздание Activity в Android
- Задача
- Решение
- Подробное решение
- Модель
- Способы построения активной модели
- Представление
- 1. Обновление UI виджетов.
- 2. Подключение слушателя к ticket
- 3. Подключение слушателя к TicketSubsystem
- Асинхронная операция «Взять билет»
- Восстановление состояния при рестарте
- Layers
- Назначение уровней
- Обновление данных в activity
- Перезагрузить активность в Android
- 14 ответов
Как обновить активити android
Может случиться такая ситуация, когда вам нужно обновить все данные в компонентах Activity, но Вы прописали такую сложную логику, что уже не в силах разобраться, где что и как обновлять. Но вы знаете точно, что инициализация всего содержимого с новыми параметрами конструкторов по новой точно приведет к нужному результату.
Так вот. Быстрое решение — заново перезапустить вашу Activity (при условии, что она не держит какие-то важные «рабочие» потоки)!
Решение, подсмотренное на ресурсе stackoverflow.com
Конечно же, не рекомендуется постоянно вести такую практику. Акция скоре одноразовая, желательно, чтобы вы заменили это другим кодом, а вашу архитектуру пересмотрели и переписали как более понятную и чистую.
Итак, быстрый и малозатратный по ресурсам устройства способ перезапуска Activity:
private void reload(int x, . ВАШИ ПАРАМЕТРЫ)
<
Intent intent = getIntent();
intent.putExtra(Работаем с объектом Intent);//1
intent.putExtra(Работаем с объектом Intent);//2
intent.putExtra(Работаем с объектом Intent);//3
overridePendingTransition(0, 0);//4
intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);//5
finish();//6
overridePendingTransition(0, 0);//7
startActivity(intent);//8
>
Комментарии к коду:
В 1-3 строчках (пронумерованы условно в теле метода) мы работаем с объектом Intent, который запустит наш новый экземпляр такой же Activity. Строки 4-7 убирают всяческие переходы, анимацию и красоту. Таким образом, для пользователя будет отображаться как бы старая форма, что и была, но данные в ней будут новые! Никаких переходов, анимаций, перекидываний, вычислительные ресурсы на это не тратятся. Чудесно.
Вызываем данный метод из Activity, когда желаем обновиться.
Источник
Асинхронные операции и пересоздание Activity в Android
В одной статье на хабре (274635) было продемонстрировано любопытное решение для передачи объекта из onSaveInstanceState в onRestoreInstanceState без сериализации. Там используется метод writeStrongBinder(IBInder) класса android.os.Parcel .
Такое решение корректно функционирует до тех пор, пока Android не выгрузит ваше приложение. А он вправе это сделать.
Однако это не главное. (Если приложению не нужно восстанавливать свое состояние после такого рестарта, то подойдет и это решение).
А вот цель, для чего там используются такие «несериализуемые» объекты мне показалась странной. Там через них передаются вызовы из асинхронных операций в Activity , чтобы обновить отображаемое состояние приложения.
Я всегда думал, что со времен Smalltalk, любой разработчик распознает эту типовую задачу проектирования. Но кажется я оказался не прав.
Задача
- По команде от пользователя ( onClick() ) запустить асинхронную операцию
- По завершению операции отобразить результат в Activity
Особенности
- Activity , отображаемая в момент завершения операции, может оказаться
- та же, из которой поступила команда
- другим экземпляром того же класса (поворот экрана)
- экземпляром другого класса (пользователь перешел на другой экран в приложении)
- На момент завершения операции может оказаться, что ни одна Activty из приложения не отображается
В последнем случае результаты должны отображаться при следующем открытии Activity .
Решение
MVC (с активной моделью) и Layers.
Подробное решение
Вся остальная часть статьи — это объяснение что такое MVC и Layers.
Поясню на конкретном примере. Пусть нам необходимо построить приложение «Электронный билет в электронную очередь».
- Пользователь входит в отделение банка, нажимает в приложении кнопку «Взять билет». Приложение посылает запрос на сервер и получает билет.
- Когда подходит очередь в приложении отображается номер окошка в которое нужно обратиться.
Получение билета от сервера я сделаю с помощью асинхронной операции. Также асинхронными операциями будут считывание билета из файла (после перезапуска) и удаление файла.
Построить такое приложение можно из несложных компонентов. Например:
- Компонент где будет находиться билет ( TicketSubsystem )
- TicketActivity где будет отображаться билет и кнопка «Взять билет»
- Класс для Билета (номер билета, позиция в очереди, номер окошка)
- Класс для Асинхронной операции получения билета
Самое интересное то, как эти компоненты взаимодействуют.
Приложение вовсе не обязано содержать компонент TicketSubsystem . Билет мог бы находиться
в статическом поле Ticket.currentTicket , или в поле в классе-наследнике android.app.Application .
Однако очень важно, чтобы состояние есть/нет билета исходило из объекта способного выполнять роль
Модель из MVC — т. е. генерировать уведомления при появлении (или замене) билета.
Если сделать TicketSubsystem моделью в терминах MVC , то Activity сможет подписаться на события и обновить отображение билета когда тот будет загружен. В этом случае Activity будет выполнять роль View ( Представление ) в терминах MVC .
Тогда асинхронная операция «Получение нового билета» сможет просто записать полученный билет в TicketSubsystem и больше ни о чем не заботиться.
Модель
Очевидно, что моделью должен являться билет. Однако в приложении билет не может «висеть» в воздухе. Кроме того, билет изначально не существует, он появляется только по завершению асинхронной операции. Из этого следует, что в приложении должно быть еще что-то где будет находиться билет. Пусть это будет TicketSubsystem . Сам билет также должен быть как-то представлен, пусть это будет класс Ticket . Оба этих класса должны быть способны выполнять роль активной модели.
Способы построения активной модели
Активная модель — модель оповещает представление о том, что в ней произошли изменения. wikipedia
В java есть несколько вспомогательных классов для создания активной модели. Вот например:
- PropertyChangeSupport и PropertyChangeListener из пакета java.beans
- Observable и Observer из пакета java.util
- BaseObservable и Observable.OnPropertyChangedCallback из android.databinding
Мне лично нравится третий способ. Он поддерживает строгое именование наблюдаемых полей, благодаря аннотации android.databinding.Bindable . Но есть и другие способы, и все они подходят.
А в Groovy есть замечательная аннотация groovy.beans.Bindable. Вместе с возможностью краткого объявления свойств объекта получается очень лаконичный код (который опирается на PropertyChangeSupport из java.beans ).
Представление
TicketActivity (как практически все объекты относящиеся к представлению) появляется и исчезает по воле пользователя. Приложение всего лишь должно корректно отображать данные в момент появления Activity и при изменении данных пока отображается Activity .
Итак в TicketActivity нужно:
- Обновлять UI виджеты при изменении данных в ticket
- Подключать слушателя к Ticket когда он появится
- Подключать слушателя к TicketSubsytem (чтобы обновить вид, когда появится ticket )
1. Обновление UI виджетов.
В примерах в статье я буду использовать PropertyChangeListener из java.beans ради демонстрации
подробностей. А в исходном коде по ссылке внизу статьи будет использоваться библиотека android.databinding ,
как обеспечивающая самый лаконичный код.
2. Подключение слушателя к ticket
Метод setTicket при замене билета удаляет подписку на события от старого билета и подписывается на события от нового билета. Если вызывать setTicket(null) , то TicketActivity отпишется от событий ticket .
3. Подключение слушателя к TicketSubsystem
Код получается довольно простым и прямолинейным. Но без использования специальных инструментов приходится писать довольно много однотипных операций. Для каждого элемента в иерархии модели приходится заводить поле и создавать отдельный слушатель.
Асинхронная операция «Взять билет»
Код асинхронной операции тоже довольно простой. Основная идея в том, чтобы по завершению асинхронной операции записывать результаты в Модель . А Представление обновится по уведомлению из Модели .
Здесь ссылка globalTicketSubsystem (она также упоминалась в TicketActivity ) зависит от способа компоновки подсистем в вашем приложении.
Восстановление состояния при рестарте
Допустим, что пользователь нажал кнопку «Взять билет», приложение послало запрос на сервер, а в это время случился входящий звонок. Пока пользователь отвечал на звонок, пришел ответ от сервера, но пользователь об этом не знает. Мало того, пользователь нажал «Home» и запустил какое-нибудь приложение, которое сожрало всю память и системе пришлось выгрузить наше приложение.
И вот наше приложение должно отобразить билет полученный до рестарта.
Чтобы обеспечить эту функциональность я буду записывать билет в файл и считывать его после старта приложения.
Layers
Этот шаблон определяет правила по которым одним классам позволяется зависеть от других классов, так чтобы не возникало чрезмерной запутанности кода. Вообще это семейство шаблонов, а я ориентируюсь на вариант Крейга Лармана из книги «Применение UML и шаблонов проектирования». Вот здесь есть диаграмма.
Основная идея в том, что классам с нижних уровней нельзя зависеть от классов с верхних уровней. Если разместить наши классы по уровням Layers , то получится примерно такая диаграмма:
Обратите внимание, что все стрелочки, что пересекают границы уровней, направлены строго вниз! TicketActivity создает GetNewTicket — стрелка вниз. GetNewTicket создает Ticket — стрелка вниз. Анонимный ticketListener реализует интерфейс PropertyChangeListener — стрелка вниз. Ticket оповещает слушателей PropertyChangeListener — стрелка вниз. И т. д.
То есть любые зависимости (наследование, использование в качестве типа члена класса, использование в качестве типа параметра или типа возвращаемого значения, использование в качестве типа локальной переменной) допустимы только к классам на том же уровне или на уровнях ниже.
Еще капельку теории, и перейдем к коду.
Назначение уровней
Объекты на уровне Domains отражают бизнес-сущности с которыми работает приложение. Они должны быть независимы от того как устроено наше приложение. Например наличие поля positionInQueue у Ticket обусловлено бизнес требованиями (а не тем, как мы написали наше приложение).
Уровень Application — это граница того, где может располагаться логика приложения (кроме формирования внешнего вида). Если нужно сделать какую-то полезную работу, то код должен оказаться здесь (или ниже).
Если нужно сделать что-то обладающее внешним видом, то это класс для уровня Presentation . А значит этот класс может содержать только код отображения, и никакой логики. За логикой ему придется обращаться к классам с уровня Application .
Принадлежность класса к определенному уровню Layers — условна. Класс находится на заданном уровне до тех пор пока выполняет его требования. То есть в результате правки класс может перейти на другой уровень, или стать непригодным ни для одного уровня.
Как определить на каком уровне должен находиться заданный класс? Я поделюсь скромной эвристикой, а вообще рекомендую изучить доступную теорию. Начинайте хоть здесь.
Эвристика
- Если приложению удалить Уровень Представления, то оно должно быть в состоянии выполнить все свои функции (кроме демонстрации результатов). Наше приложение без Уровня Представления всё ещё будет содержать и код для запроса билета, и сам билет, и доступ к нему.
- Если объект какого-то класса что-то отображает, или реагирует на действия пользователя, то его место на Уровне Представления.
- В случае противоречий — разделяйте класс на несколько.
Источник
Обновление данных в activity
Всем доброй ночи!
Как обновить данные в активити при возврате из диалога или из другой активити, т.е. когда фокус возвращается на активити?
Блин, запутанно получилось.
Вообщем, есть код, который выполняет обновление представления, выполняет поиск данных и обновляет ViewPager, куда его поместить, чтобы это происходило каждый раз, когда активити становиться активной вновь: закрытие диалога, подтверждение в диалоге с последующим закрытием, нажатие кнопки «назад» или в ActionBar, возвращающее на данную активити из другой. Вообщем при каждом возврате фокуса к данной активити.
Обновление данных Activity при нажатии на кнопку
Приветствую всех. Проблема такая: необходимо обновлять данные(ImageView, TextView и т.п.) в.
Android — Передача данных с одного Activity на другое Activity
Здравствуйте , возникла необходимость получения числовых (int и float ну или double) данных в одном.
Как изменить кнопку на втором Activity с первого Activity в Android Studio?
Общая задача сделать уровни для игры, по окончанию первого уровня, появляется кнопка «выбор уровня».
Как в Android Studio изменять объект одного Activity из другого Activity?
Есть два Activity, в одном кнопка и элемент editText. Во втором activity есть элемент TextView.
Но при закрытии диалога эти события не возникают.
Источник
Перезагрузить активность в Android
это хорошая практика, чтобы перезагрузить Activity на Android?
что было бы лучшим способом сделать это? this.finish а то this.startActivity активность Intent ?
14 ответов
Вы можете просто использовать
обновление Activity изнутри.
это то, что я делаю, чтобы перезагрузить действие после изменения возврата из изменения предпочтений.
это по существу заставляет активность перерисовывать себя.
обновление: лучший способ сделать это-вызвать recreate() метод. Это приведет к воссозданию активности.
для тех, кто не хочет видеть, что мигает после recreate () метод просто использовать
Мне нужно было срочно обновить список сообщений в одном из моих приложений, поэтому я просто выполнил обновление моей основной активности пользовательского интерфейса, прежде чем закрыть диалоговое окно, в котором я был. Я уверен, что есть и лучшие способы добиться этого.
Android включает в себя систему управления процессами, которая обрабатывает создание и уничтожение деятельности, которая в значительной степени отрицает любую выгоду, которую вы увидите от ручного перезапуска деятельности. Вы можете посмотреть дополнительную информацию о нем по адресу Основы Применения
хорошая практика заключается в том, чтобы гарантировать, что ваши методы onPause и onStop освобождают любые ресурсы, которые вам не нужно удерживать и использовать onLowMemory уменьшить ваши потребности деятельностей до абсолютного минимума.
Источник