Статьи

Google I / O 2017 Aftermath: создание компонентов, поддерживающих жизненный цикл

Как обычно, в этом году на Google I / O было много объявлений, связанных с Android.

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

В этом первом посте мы рассмотрим коллекцию библиотек, целью которых является облегчить управление жизненным циклом, предоставляя вам возможность создавать компоненты с учетом жизненного цикла, которые могут автоматически отслеживать события жизненного цикла и реагировать на них. Я также предоставлю краткое введение в два других компонента, которые были разработаны для использования с этими новыми компонентами, поддерживающими жизненный цикл: LiveData и Room.

Соблюдение жизненного цикла ваших 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 и другими наблюдаемыми, такими как 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!

  • Android
    Создать голосовое приложение для Android
    Ашраф Хатхибелагал
  • Android SDK
    Бессерверные приложения с облачными функциями Firebase
    Чике Мгбемена
  • Android SDK
    Оперативное программирование операторов в RxJava 2