코틀린 프로젝트로 안드로이드 lifecycle 패키지를 사용해보기

오늘은 코틀린 안드로이드 프로젝트에 androidx 패키지의 lifecycle를 사용해보려 합니다.

Gradle

implementation "androidx.lifecycle:lifecycle-extensions:2.0.0-rc01"

먼저 androidx 패키지의 lifecycle-extensions를 추가하여 view model과 lifcycle을 같이 사용할 수 있게 합니다.

model

data class TestModel(
        val Notifier: MutableLiveData<Int> = MutableLiveData()
)

모델은 lifecycle에 존재하는 MutableLiveData 타입의 변수를 만들어줍니다.

view model

open class MainViewModel(private var count: Int = 0) : ViewModel(),LifecycleObserver{
    val model = TestModel()
    fun increment() {
        model.Notifier.value = ++count
    }

MutableLiveData에 count를 증가시켜 반영해주는 함수를 만들어줍니다.

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun resume(){
        if (count != 0){
            increment()
        }

    }
}

LifecycleObserver를 상속받아서 생명주기 상태가 ON_RESUME일 때만 resume 함수를 실행합니다.

view

class AFragment : BaseFragment()

androidx.fragment.app.Fragment를 import해준 Fragment를 상속받은 BaseFragment 클래스를 상속받아줍니다.

private val viewModel by lazy { ViewModelProviders.of(this).get(MainViewModel::class.java) }

ViewModelProviders 메소드로 MainViewModel과 연결해줍니다.

private val observer = Observer<Int> {
    printCount(it)
}
private fun printCount(value: Int) {
    test_text.text = value.toString()
}

Observer로 값이 변경되면 알려주는 observer를 만들어서 값을 뷰에 출력되게 만듭니다.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    return inflater.inflate(R.layout.fragment_a,container,false)
}

fragment에서 화면을 출력하기 위해 onCreateView에서 inflate 해주며 반환해줍니다.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        connectViewModel()
        clickEvent()
    }

    private fun clickEvent(){
        testButton.setOnClickListener {
            viewModel.increment()
        }
    }

    private fun connectViewModel(){
        viewModel.model.Notifier.observe(this,observer)
        lifecycle.addObserver(viewModel)
    }
}

fragment에서 뷰가 만들어지면 버튼 클릭 이벤트 리스너를 등록해주고, observe, lifecycle도 연결해줍니다.

Written on August 25, 2018