Android Jetpack: ViewModel

[제트 블래스트] LYLA FUJIWARA : Google I / O 2017에서, 우리는 라이프 사이클 라이브러리를 발표했습니다 라이프 사이클 라이브러리는 일련의 라이브러리 및 지침입니다

메모리 누출을 피하고 일반 Android를 해결하기 위해 수명주기 문제 이제 Lifecycle Library 20이 출시되었습니다 그것은 제트 팩의 일부입니다 또한 데이터 바인딩과의 새로운 통합도 포함됩니다

Lifecycle Library의 ViewModel 클래스 둘러보기입니다 ViewModel은 앱의 UI 데이터를 보유합니다 생존하는 구성 변경도 가능합니다 이것이 실제로 유용한 이유입니다 휴대 전화 회전은 구성으로 간주됩니다

변화 구성 변경으로 인해 전체 활동이 발생 함 찢어지고 다시 만들어지기 위해서 데이터를 올바르게 저장 및 복원하지 않은 경우 파괴 된 활동에서 그 데이터를 잃을 수도 있습니다 이상한 UI 버그 또는 심지어 충돌로 끝납니다 그렇다면 ViewModel을 입력하십시오

물론, 구성 변경 사항은 유지됩니다 모든 UI 데이터를 활동에 저장하는 대신, 대신 ViewModel에 넣으십시오 이제 이것은 구성 변경에 도움이됩니다 그러나 그것은 또한 일반적인 좋은 소프트웨어 디자인 일뿐입니다 Android 용으로 개발할 때 공통적으로 나타나는 한 가지 함정 많은 변수, 논리 및 데이터를 넣고 있습니다

당신의 활동과 파편으로 이것은 크고, 유지 보수가 불가능한 클래스의 엉망을 만듭니다 단일 책임 원칙을 위반합니다 ViewModel을 사용하여 해당 책임을 쉽게 나눌 수 있습니다 ViewModels은 보유에 대한 책임이 있습니다 UI에 표시 할 모든 데이터 그리고 그 활동은 오직 책임이 있습니다

해당 데이터를 화면에 그리는 방법을 아는 사람 사용자 상호 작용을 수신하지만이를 처리하는 것은 아닙니다 앱이 데이터를로드하고 저장하는 경우, 저장소 클래스를 만드는 것이 좋습니다 "App 아키텍처 안내서"에 설명되어 있습니다 ViewModel이 비대화되지 않도록하십시오 너무 많은 책임이 있습니다

이것을 피하기 위해 발표자 클래스를 만들 수 있습니다 보다 완전한 클린 아키텍처를 구현할 수 있습니다 ViewModel을 만들려면 결국 ViewModel 클래스를 확장합니다 그런 다음 UI 관련 인스턴스 변수를 이전에 귀하의 ViewModel에 귀하의 활동에 있었던 그런 다음 활동의 onCreate에서 당신은 프레임 워크 유틸리티 클래스에서 ViewModel을 얻는다

호출 된 ViewModel Provider ViewModel Provider가 액티비티 인스턴스를 가져옵니다 이것은 다음을 허용하는 메커니즘입니다 당신은 장치를 회전시키고, 기술적으로 새로운 활동을 얻습니다 예를 들어, 활동 인스턴스가 연관되어 있는지 항상 확인하십시오

같은 ViewModel를 사용합니다 ViewModel 인스턴스를 사용하면 Getters 및 Setters를 사용하여 액세스하십시오 활동의 UI 데이터 기본 생성자를 수정하려는 경우 현재 매개 변수가 없으므로 ViewModel Factory를 사용해 커스텀 생성자을 작성할 수 있습니다 이제는 ViewModel의 가장 간단한 사용 사례입니다

그러나 ViewModel 클래스도 잘 작동하도록 설계되었습니다 LiveData와 데이터 바인딩 이 모든 기능을 함께 사용하면 반응적인 UI를 만들 수 있습니다 이는 자동으로 UI를 말하는 멋진 방법 일뿐입니다 기본 데이터가 변경 될 때마다 업데이트됩니다

이것은 ViewModel에있는 모든 데이터를 가정합니다 화면에 표시하려는 내용은 LiveData에 래핑됩니다 그런 다음 데이터 바인딩을 정상적으로 설정해야합니다 다음은 데이터가있는 예제 XML입니다 바인딩 레이아웃 태그와 변수 태그 귀하의 ViewModel에 대한

그런 다음 당신의 활동이나 단편에서, XML에 사용 된 변수를 바인딩과 연관시킵니다 다음은 활동이있는 예입니다 새로운 코드 행 setLifecycleOwner가 있습니다 바인딩을 통해 LiveData 객체를 관찰 할 수 있습니다 ViewModel에서

그리고 그것은 본질적으로 LiveData가 업데이트 될 때마다 바인딩 업데이트를 허용합니다 ViewModel이 화면 상에 표시됩니다 이제 LiveData 필드를 직접 참조 할 수 있습니다 XML의 ViewModel에서 가져옵니다 이것을 바인딩 어댑터와 결합하면, 당신은 상용구의 많은 부분을 이동할 수 있습니다

당신의 활동에서 벗어난 논리 Android Studio 31에서이 기능을 사용할 수 있습니다 이상이므로 올바른 버전인지 확인하십시오 자세한 내용은 LiveData 소개 (영문)를 확인하십시오

문서에서 좋아, 몇 가지 모범 사례로 마무리하겠습니다 첫 번째 팁, 결코 ViewModels에 컨텍스트를 전달해서는 안됩니다 이것은 파편, 활동, 또는 전망 앞서 보았 듯이 ViewModels는 특정 활동 및 조각 수명주기보다 오래 지속됩니다

ViewModel에 액티비티를 저장한다고 가정 해 보겠습니다 화면을 회전하면 해당 활동이 삭제됩니다 이제 참조를 보유한 ViewModel이 생겼습니다 파괴 된 활동에 그리고 이것은 메모리 누수입니다

따라서 애플리케이션 컨텍스트가 필요한 경우 ViewModel 수명주기를 초과하면 Android ViewModel을 사용하십시오 대신 하위 클래스 여기에는 사용할 응용 프로그램에 대한 참조가 포함됩니다 OK, 두 번째 팁 ViewModels는 추가로 사용하기위한 것입니다

onSaveInstanceState에 ViewModels는 프로세스 종료 후에도 살아남지 못합니다 리소스 제한으로 인해 그러나 onSaveInstance 번들은 않습니다 ViewModels는 방대한 양의 데이터를 저장하는 데 유용합니다 onSaveInstanceState 번들,별로

ViewModel을 사용하여 최대한 많은 UI 데이터 저장 해당 데이터를 다시로드하거나 재생성 할 필요가 없습니다 구성 변경 중 한편, onSaveInstanceState는, 가장 작은 양의 데이터를 저장해야 함 프로세스가 종료 된 경우 UI 상태를 복원하는 데 필요 프레임 워크에 의해 예를 들어, 사용자의 모든 데이터를 저장할 수 있습니다 ViewModel 내에 있지만 사용자의 데이터베이스 ID 만 저장하면됩니다

onSaveInstanceState에 있습니다 바라기를 이것은 새로운 ViewModel을 시험해 보는 데 영감을주었습니다 클래스 자체에서 또는 다른 아키텍처 구성 요소와 함께 사용할 수 있습니다 ViewModels 또는 ViewModels를 사용하는 방법에 대해 자세히 알아 보려면 내가 방금 언급 한 정보의 아래의 문서를 확인하십시오 [제트 블래스트]