Как обычно, в этом году на Google I / O было много объявлений, связанных с Android.
В этой серии быстрых советов мы подробнее рассмотрим некоторые обновления программного обеспечения и новые выпуски, которые вы можете получить сегодня .
В этом первом посте мы рассмотрим коллекцию библиотек, целью которых является облегчить управление жизненным циклом, предоставляя вам возможность создавать компоненты с учетом жизненного цикла, которые могут автоматически отслеживать события жизненного цикла и реагировать на них. Я также предоставлю краткое введение в два других компонента, которые были разработаны для использования с этими новыми компонентами, поддерживающими жизненный цикл: LiveData и Room.
LifecycleOwner и LifecycleObserver
Соблюдение жизненного цикла ваших Activity
и Fragment
имеет решающее значение для создания успешного приложения. Неправильно поймите эти основы, и вы столкнетесь с утечками памяти, которые приводят к зависанию вашего приложения и, возможно, даже к сбою.
Другая повторяющаяся проблема, с которой вы можете столкнуться при управлении жизненным циклом, — это попытка обновить пользовательский интерфейс вашего приложения, когда действие или фрагмент не находятся в допустимом состоянии. Например, если Activity
получает обратный вызов после его остановки, то вполне вероятно, что ваше приложение будет аварийно завершено.
Чтобы помочь вам избежать всех проблем, связанных с управлением жизненным циклом, Google анонсировал новый набор компонентов, учитывающих жизненный цикл, которые могут отслеживать жизненный цикл действия или фрагмента и соответствующим образом корректировать их поведение.
Сегодня вы можете получить доступ к этим компонентам архитектуры Android через репозиторий Google Maven. Тем не менее, они все еще находятся в альфа-версии, поэтому вы должны ожидать каких-то серьезных изменений до выпуска 1.0.
В частности, классы Fragment
и AppCompatActivity
настоящее время не могут реализовать новый интерфейс LifecycleOwner
. Вам нужно будет использовать временные классы LifecycleActivity
и LifecycleFragment
пока компоненты архитектуры Android не достигнут своей версии 1.0. Эти классы будут устаревшими, как только фрагменты и Действия Android будут обновлены для поддержки компонентов жизненного цикла.
Чтобы начать экспериментировать с этими компонентами, вам нужно добавить репозиторий Google Maven в файл build.gradle уровня проекта :
1
2
3
4
5
6
7
8
9
|
allprojects {
repositories {
jcenter()
//Add the Google Maven repository//
maven { url ‘https://maven.google.com’ }
}
}
|
Затем откройте файл build.gradle уровня модуля и добавьте следующее:
1
2
3
4
5
6
|
dependencies {
compile fileTree(dir: ‘libs’, include: [‘*.jar’])
compile «android.arch.lifecycle:runtime:1.0.0-alpha1»
compile «android.arch.lifecycle:extensions:1.0.0-alpha1»
annotationProcessor «android.arch.lifecycle:compiler:1.0.0-alpha1»
|
Существует несколько компонентов архитектуры Android, но в этой статье мы сосредоточимся на следующих двух:
-
LifecycleOwner
: это то, что имеет жизненный цикл, например,Activity
илиFragment
. -
LifecycleObserver
: это класс, который может отслеживать состояние жизненного цикла компонента с помощью аннотированных методов. Эти методы вызываются всякий раз, когда связанный компонент входит в соответствующее состояние жизненного цикла.
Перемещая код, который отслеживает события жизненного цикла и реагирует на них, в отдельный LifecycleObserver
, вы можете предотвратить выход из-под контроля действия или методов, связанных с жизненным циклом фрагмента (таких как onStart
и onStop
), что делает ваш код гораздо более понятным для человека.
В следующем примере мы реализуем LifecycleObserver
, а затем используем @OnLifeCycleEvent
для реагирования на различные события жизненного цикла:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleObserver;
import android.arch.lifecycle.OnLifecycleEvent;
public class SecondActivity implements LifecycleObserver {
…
…
…
lifecycle.addObserver(this);
}
@OnLifecycleEvent(Lifecycle.Event.ON_START) void start() {
//When the Activity enters an ON_START state, do something//
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP) void stop() {
//When the Activity enters an ON_STOP state, do something//
}
//When the Activity is destroyed, unregister the LifecycleObserver//
@OnLifecycleEvent(Lifecycle.Event.ON_DESTORY) void cleanup() {
lifecycle.removeObserver(this);
}
}
|
Затем в Activity
вы хотите отслеживать, расширьте LifecycleActivity
чтобы получить доступ к информации LifecycleObserver
:
1
|
public class MainActivity extends LifecycleActivity {
|
Многие операции могут выполняться только тогда, когда фрагмент или действие находятся в определенном состоянии. Вы можете использовать lifecycle.getState
чтобы быстро и легко проверить текущее состояние компонента, а затем выполнить действие, только если компонент находится в правильном состоянии:
1
|
if (lifecycle.getState().isAtLeast(STARTED)) {
|
LiveData
LiveData
— это наблюдаемый держатель данных, который LiveData
поток событий, которые вы можете наблюдать.
Основное различие между LiveData
и другими наблюдаемыми, такими как RxJava, заключается в том, что LiveData
знает о жизненном цикле Android. LiveData
учитывает состояние жизненного цикла ваших действий, фрагментов и служб и будет управлять подписками для вас.
Важно отметить, что если жизненный цикл наблюдателя неактивен, наблюдатель не будет уведомлен об изменениях в LiveData
, что предотвратит сбои приложения, которые могут возникнуть при попытке LiveData
обновления на остановленные компоненты.
Чтобы использовать LiveData
, вам просто нужно сообщить своей Activity
что вы хотите наблюдать некоторые данные в течение жизненного цикла:
01
02
03
04
05
06
07
08
09
10
11
|
public class MyActivity extends LifecycleActivity {
public void onCreate(Bundle savedState) {
LiveData<User> userData;
//Get user data from somewhere//
userData.observe(this, user -> {
});
}
}
|
Как только действие начинается, оно начинает наблюдать LiveData
, и ваш наблюдатель будет получать обновления всякий раз, когда значение этих LiveData
изменяется. Если действие будет уничтожено, то подписка будет удалена автоматически.
Если действие остановлено из-за изменения конфигурации, то новый экземпляр этого Activity
получит последнее доступное значение из LiveData
.
LiveData
имеет некоторые сходства с RxJava, но официальное слово от ввода-вывода Google состоит в том, что если вы знакомы с RxJava, то вам следует начать свои проекты Android с LiveData
, поскольку он разработан так, чтобы быть простым, быстрым и легким, а также интегрировать хорошо с рамкой Android. Затем вы можете добавить функции RxJava, если вам нужны дополнительные функции реактивного программирования .
Если вы хотите использовать LiveData
с библиотекой RxJava 2, откройте файл build.gradle уровня модуля и добавьте следующее:
1
|
compile «android.arch.lifecycle:reactivestreams:1.0.0-alpha1»
|
После этого вы сможете использовать следующие методы:
-
toPublisher
: Адаптирует потокLiveData
кPublisher
ReactiveStreams.
1
2
|
public static <T> Publisher<T> toPublisher(
final LifecycleOwner lifecycle, final LiveData<T> liveData) {
|
-
fromPublisher
: создает наблюдаемый потокLiveData
от издателя ReactiveStreams.
1
|
public static <T> LiveData<T> fromPublisher(final Publisher<T> publisher)
|
Библиотека номеров
Хотя платформа Android имеет встроенную поддержку для работы с необработанным контентом SQL, эти API довольно низкоуровневы и требуют много времени для реализации.
Новая библиотека Room от Google обещает абстрагироваться от некоторых деталей реализации работы с необработанными таблицами SQL и запросами. Это также должно помочь уменьшить объем стандартного кода, который необходимо написать для преобразования запросов SQL в объекты данных Java, и имеет класс Migration
, который можно использовать для обновления приложения без потери данных пользователя.
Чтобы использовать Room, откройте файл build.gradle уровня модуля и добавьте в раздел dependencies
:
1
2
|
compile «android.arch.persistence.room:runtime:1.0.0-alpha1»
annotationProcessor «android.arch.persistence.room:compiler:1.0.0-alpha1»
|
При выполнении запросов вы обычно хотите, чтобы ваш пользовательский интерфейс обновлялся автоматически при изменении данных; с помощью Room вы можете добиться этого, используя тип возвращаемого значения LiveData
.
Наконец, если вы используете RxJava, то ваши запросы Room также могут возвращать объекты Publisher
и Flowable в RxJava 2. Чтобы использовать RxJava с Room, вам нужно открыть файл build.gradle уровня модуля и добавить следующее в раздел dependencies
:
1
|
compile ‘android.arch.persistence.room:rxjava2:1.0.0-alpha1’
|
Вывод
В этом кратком совете я показал вам, как управлять жизненным циклом Android, используя LifecycleOwner и LifecycleObserver, и познакомил вас с двумя дополнительными компонентами, которые вы, возможно, захотите использовать вместе с проектом Lifecycle.
В следующем совете мы рассмотрим планы Google по объединению компонентов пользовательского интерфейса Android Wear с библиотекой поддержки Android, а также некоторые дополнения к сложностям Android Wear.
А пока ознакомьтесь с другими нашими уроками и видео-курсами по разработке приложений для Android!