ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android Architecture Components #3 - LiveData
    Android/AAC 2019. 7. 31. 16:11

    제목부터 재미있어 보이는 LiveData!

     

    LiveData는 Activity나 Fragment의 수명주기에 따라 Observable한 data holder 클래스이다.
    따라서 어떤 데이터의 실시간 변화에 따른 UI 업데이트가 필요할 때 사용합니다.


    Observer pattern을 사용하여, UI component가 data가 변화를 요청하여 변경점이 있으면 업데이트 하는것이 아니라, Data driven 방식으로 data가 변경되면 UI에게 업데이트를 알려준다.

     

    실제로 ViewModel에서 데이터를 가져다 쓰는 View 입장에서는 ViewModel의 데이터가 바뀌면 View로 바뀌어야 하는데 실제 Rx나 LiveData를 쓰지 않고서는 좀 복잡하게 캐치를 해야하는 번거러움이 있다.

     

    이를 Google에서 LiveData를 통해 도움을 주게 되었다

    AAC ViewModel 포스팅의 코드를 가지고 와 보았다.

     

    class MainActivity : AppCompatActivity() {
    
        lateinit var viewModel: MainViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
            main_view_count.text = viewModel.count.toString()
    
            main_button_click.main_button_click.setOnClickListener {
                viewModel.click()
                main_view_count.text = viewModel.count.toString()
            }
        }
    
    }

    뭔가 이상한 점이 있지 않은가..? 그리고 불필요한 코드도 보이는거 같다.

    main_view_count.text = viewModel.count.toString()

    해당 코드가 2번이나 사용이 된다. OnCreate에서 한번, 버튼을 클릭하면 한번

    2번의 사용 이유는 화면 회전시 onCreate가 다시 실행됨으로 1번 버튼 클릭하였으니 다시 1번

     

    만약 증가 버튼, 감소 버튼, 리셋 버튼을 만들게 되면 무려 해당 코드가 4번이나 들어가게 된다.

    그래서 생각을 해보면 그냥 ViewModel의 count값이 변경되면 그걸 캐치해서 데이터를 전달 해주면 안될까?

    라는 의문증에서 나온것이 바로 LiveData이다.


    1. ViewModel 재구성 하기

     

    class MainViewModel : ViewModel() {
    
        val count: LiveData<Int>
            get() = _count
    
        private val _count = MutableLiveData<Int>()
    
        fun click() {
            _count.value = (_count.value ?: 0) + 1
        }
    
    }

    LiveData 사용법은 간단하다

     

    LiveData는 Only Read이고 MutableLiveData는 Read Write둘다 가능하다 그래서 외부에서 접근은 LiveData 내부에서 접근은 MutableLiveData를 하는것이 좋다!!

     

    MutableLiveData에 데이터를 넣는 방법은 setValue와 postValue 두가지가 있는데 setValue와 postValue의 차이는 setValue는 메인스레드에서 사용하여야 하고 postValue는 백그라운드에서 사용하여야 한다.


    2. Activity 재구성 하기

    class MainActivity : AppCompatActivity() {
    
        lateinit var viewModel: MainViewModel
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
            viewModel.count.observe(this, Observer {
                main_view_count.text = it.toString()
            })
    
            main_button_click.main_button_click.setOnClickListener {
                viewModel.click()
            }
        }
    
    }

    viewModel의 LiveData를 가져와서 observe 해주면 된다. 첫번째 인자는 LifeCycler이라 this를 넣어주면 되고 Observer 를 구현하여 해당 데이터의 변동이 있을때의 처리방식을 설정해주면 된다.

    댓글

Designed by Tistory.