안드로이드 ViewModel과 LiveData를 이용한 간단한 observer예제

MVVM구조를 공부 중인데 observer를 배웠다.
스타크래프트 옵저버처럼 특정 데이터가 바뀌면 나한테 알려주는 애다.

다른 예제를 봤는데 observer를 람다식으로 만들고 했지만 나는 인터페이스를 상속받아서 하는 식으로 구현을 해보았다.

예제를 요약하자면 버튼을 누를때마다 ViewModel에 LiveData를 만들고
그 데이터에 옵저버를 달아서 값이 바뀔때마다 onChanged메소드가 호출되는 것을 확인해 볼 것이다.

뷰모델은 간단하게 LiveData만 가지게 해놨다.

이제 MainActivity에 가서 뷰모델과 옵저버를 설정해주자.

observer에 빨간줄이 뜰텐데 여기엔 옵저버를 넣어줘야한다.

나는 람다로 옵저버를 만드는 식이 아니라 onChanged를 오버라이드 해주기 위해서 observer인터페이스를 상속받을거다.

MainActivity에 Observer의 제네릭을 LiveData자료형과 같이 하고 상속받으면
빨간줄이 뜰 것이다.

클릭해서 onChanged메소드를 implement해준다.

이제 버튼이 눌릴때마다 라이브데이터를 바꾸는 로직이다.

전체코드

xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/btn_test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.kt

class MainActivity : AppCompatActivity(), Observer<String> {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    lateinit var viewModel: MainViewModel
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        //프로바이더를 통해 뷰모델 가져오기
        viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
        //뷰모델에 있는 LiveData의 값의 변경사항을 관찰 할 수 있는 옵저버를 설정한다.
        viewModel.liveData.observe(this, this)

        var i: Int = 0
        binding.btnTest.setOnClickListener {
            viewModel.liveData.postValue("$i")
            i++
        }
    }

    //LiveData가 바뀌면 호출됨.
    override fun onChanged(t: String?) {
        Log.e("test", "$t")
    }
}

MainViewModel.kt

class MainViewModel:ViewModel() {
    var liveData : MutableLiveData<String> = MutableLiveData<String>()
}

실행해서 Log값을 확인해보자

굿.

좋은 웹페이지 즐겨찾기