개발 일기

ViewModel 본문

Client/안드로이드

ViewModel

이건욱

viewModel은 lifecycle 에서도 UI에 관련 된 데이터를 관리하고 그리고 저장하기 위해서 설계 되었습니다.

viewModel은 화면 회전과 같은 변경에서도 데이터가 유지가 될수 있습니다.

 

안드로이드는 화면 회전과 같은 상황에서는 일시적으로 UI 관련된 데이터를 잃어 버립니다.

간단한 데이터 같은경우에는 onSaveInstanceState() , onCreate() (Bundle) 에서 serialized , deserialized 할수 있지만

잠재적으로 많은 양의 데이터 같은 경우에는 적합하지 않습니다.

 

구현 :)

class MyViewModel : ViewModel() {
        private val users: MutableLiveData<List<User>> by lazy {
            MutableLiveData().also {
                loadUsers()
            }
        }

        fun getUsers(): LiveData<List<User>> {
            return users
        }

        private fun loadUsers() {
            // Do an asynchronous operation to fetch users.
        }
    }

 

그 후에 다음과 같이 접근 할수 있습니다.

 class MyActivity : AppCompatActivity() {

        override fun onCreate(savedInstanceState: Bundle?) {
            // Create a ViewModel the first time the system calls an activity's onCreate() method.
            // Re-created activities receive the same MyViewModel instance created by the first activity.

            val model = ViewModelProviders.of(this)[MyViewModel::class.java]
            model.getUsers().observe(this, Observer<List<User>>{ users ->
                // update UI
            })
        }
    }
    

 

 

ViewModel은 onCleared() 제공하며 resource 관련한 데이터를 정리할수 있습니다.

만약에 ViewModel 에서 Application Context가 필요하면 AndroidViewModel클래스를 사용해서 생성자에 포함시킬수 있습니다.

 

 

ViewModel 생명 주기 :)

 

ViewModel 범위는 ViewModel 가져올 때 ViewModelProvider 넘긴 Lifecycle 입니다.

Share data between fragments :)

하나의 Activity에서 두개 혹은 더 많은 fragment을 소통하는 것은 흔한 상황입니다.

이런상황에서 해결하는 방법은 다양한 방법이 있지만 그 중 하나로 소개로 드릴 수 있는게 ViewModel 입니다.

 

ViewModel을 activity scope로 ViewModelProvider을 제공하면 동일한 instance을 받게 됩니다..

 

예시 :)

class SharedViewModel : ViewModel() {
    val selected = MutableLiveData<Item>()

    fun select(item: Item) {
        selected.value = item
    }
}

class MasterFragment : Fragment() {

    private lateinit var itemSelector: Selector

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        itemSelector.setOnClickListener { item ->
            // Update the UI
        }
    }
}

class DetailFragment : Fragment() {

    // Use the 'by activityViewModels()' Kotlin property delegate
    // from the fragment-ktx artifact
    private val model: SharedViewModel by activityViewModels()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        model.selected.observe(viewLifecycleOwner, Observer<Item> { item ->
            // Update the UI
        })
    }
}

 

 

 

'Client > 안드로이드' 카테고리의 다른 글

coroutine ktx  (0) 2020.03.30
Fragment recyclerView 관련 메모리 이슈  (0) 2020.03.27
Rxjava Subject  (0) 2020.03.26
Broadcast Receiver ?  (0) 2020.03.26
Service  (0) 2020.03.26
Comments