카테고리 없음

Android Architecture Components (2) Lifecycles

Machine_웅 2020. 8. 1. 21:49
728x90
반응형

 

1. Lifecycles

Lifecycles는 라이브러리 이름 답게 생명주기 모니터링을 돕습니다. 크게 2가지로 구성되어 있습니다.

(1) Lifecycle Owner

Activity, Fragment에서 생명주기를 분리하여 Lifecycle 객체에 담습니다. Lifecycle 객체를 통해 다른 곳에서 해당 화면의 생명주기를 모니터링 할 수 있습니다. 자신의 생명주기를 담은 Lifecycle 객체가 Lifecycle Owner 입니다.

 

 

// 생명주기를 Lifecycle로 담을 수 있도록 LifecycleActivity를 상속받는다.
class MainActivity extends LifecycleActivity {
    private MyLocationListener myLocationListener;
    public void onCreate(Bundle savedInstanceState) {
        // getLifecycle()로 생명주기가 담긴 Lifecycle 객체를 받는다.
        myLocationListener = new MyLocationListener(this, getLifecycle(), location -> {
            // update UI
        });
    }
}
class MyLocationListener {
    private boolean enabled = false;
    private Lifecycle lifecycle;
    public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
    }
    public void enable() {
        enabled = true;
        // Lifecycle.getCurrentState()로 생명주기 모니터링이 가능하다.
        if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
            // connect if not connected
        }
    }
}

(2) Lifecycle Observer

생명주기를 Wrapping한 Lifecycle Owner 객체를 통해 화면 밖에서도 모니터링이 가능하지만,

생명주기에 따른 동작은 여전히 화면에서만 정의할 수 있습니다.

화면 밖에서도 생명주기에 따른 동작을 정의하기 위해서는 원하는 클래스에

LifecycleObserver 인터페이스를 구현하고,

넘겨받은 Lifecycle Owner 객체에 구현한 LifecycleObserver를 등록해야 합니다.

LifecycleObserver를 구현한 클래스는 onResume() 등의 생명주기 메소드를 정의할 수 있습니다.

이 메소드들은 등록한 Lifecycle Owner가 해당 생명주기 상태가 되면 자동으로 수행되면서,

객체가 화면과 동일한 생명주기를 가진 것처럼 행동하도록 합니다.

 

class MyLocationListener implements LifecycleObserver {
    public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
        // Lifecycle에 생명주기 메소드를 정의한 LifecycleObserver를 등록한다
        lifecycle.addObserver(this);
    }
    
    // Lifecycle Owner의 onStart()에 동작할 메소드
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void start() {
        // Do something
    }
    
    // Lifecycle Owner의 onStop()에 동작할 메소드
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void stop() {
        // Do something
    }
}

Lifecycles를 통해 우리는 화면 밖에서 화면의 생명주기를 모니터링 하고, 동작을 정의할 수 있습니다. 이는 더 직관적인 생명주기 프로그래밍을 가능하게 합니다.

2. LiveData

LiveData는 데이터를 개선된 Observable로 Wrapping하여 생명주기와 데이터 변경을 인지할 수 있도록 합니다. 위 Lifecycles 예시로 든 MyLocationListener를 LiveData로 다시 구현해보겠습니다.

 

 

// LiveData를 상속받는다. Location 타입의 데이터를 Wrapping 하였다.
class MyLocationListener extends LiveData<Location> {
    public MyLocationListener(Context context) {
    }

    // 1개 이상의 active observer
    @Override
    protected void onActive() {
        // Do something
    }

    // 0개의 active observer
    @Override
    protected void onInactive() {
        // Do something
    }
}

LiveData는 Active observer 갯수에 따라 onActive(), onInactive()가 불립니다. Observer는 LiveData.observe() 메소드로 등록하며, 이 메소드는 데이터 변경을 구독합니다. Active observer라 함은 생명주기가 최소 Resumed 또는 Started에 있는 Observer를 뜻합니다. Observer가 생명주기에 따라 active, inactive 상태를 판단하기 위해 observe()를 호출할 때 Lifecycle을 넘깁니다. LiveData는 이렇게 Active observer 갯수로 생명주기를 간접적으로 인지합니다.

 

class MainActivity extends LifecycleActivity {
    public void onCreate(Bundle savedInstanceState) {
        LiveData<Location> myLocationListener = new MyLocationListener();
        // observe()로 데이터 변경 이밴트를 구독한다.
        // Active, Inactive를 판단하기 위해 observe() 할 때 Lifecycle를 넘긴다.
        myLocationListener.observe(this, location -> {
            // Data가 변경되면 동작할 콜백을 등록한다.
        });
    }

 

 

LiveData는 observe()에서 넘어온 Lifecycle로 생명주기를 모니터링하고, 함께 받은 콜백으로 데이터 변경 이벤트를 구독합니다. 콜백은 LiveData.setValue()로 데이터를 변경하면 호출됩니다.

 

class MyLocationListener extends LiveData<Location> {
    private LocationManager locationManager;
    private LocationListener listener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            // setValue()로 데이터를 변경하고 구독하는 Observer 들에게 이벤트를 전달한다.
            setValue(location);
        }
    };
}

LiveData는 이렇게 데이터 모델을 Wrapping해서 생명주기와 데이터 변경을 자연스럽게 모델 스스로 인지할 수 있도록 합니다.

 

 

 

참고 ㅣ https://medium.com/@maryangmin/android-architecture-components-%EC%86%8C%EA%B0%9C-1-8e04491be1f6

728x90
반응형