안드로이드 LiveData와 ViewModel

|

Part of Android Jetpack
https://developer.android.com/topic/libraries/architecture/livedata 를 참고하여 작성하였습니다.

LiveData

LiveData란?

Observalable한 데이터 홀더 클래스이다. Observerble과 다른점은 LiveData는 라이프사이클을 알고있다는 것이다. 이렇게 되면 라이프사이클이 active일 때만 앱 컴포넌트를 업데이트 할 수 있는 장점이 있다.

LiveData 사용법

class NameViewModel : ViewModel() {

    // Create a LiveData with a String
    val currentName: MutableLiveData<String> by lazy {
        MutableLiveData<String>()
    }

    // Rest of the ViewModel...
}

LiveData Observe하기

onCreate() 에서 LiveData를 Observe 할수있게 설정해 놓으면 라이프사이클이 활성화된 상태일 때 업데이트를 받을 수 있다.

class NameActivity : AppCompatActivity() {

    private lateinit var model: NameViewModel

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // Other code to setup the activity...

        // Get the ViewModel.
        model = ViewModelProviders.of(this).get(NameViewModel::class.java)


        // Create the observer which updates the UI.
        val nameObserver = Observer<String> { newName ->
            // Update the UI, in this case, a TextView.
            nameTextView.text = newName
        }

        // Observe the LiveData, passing in this activity as the LifecycleOwner and the observer.
        model.currentName.observe(this, nameObserver)
    }
}

LiveData 를 업데이트하기

LiveData는 public으로 데이터를 저장할 수 있는 메소드가 존재하지 않는다. MutableLiveData 클래스는 setValue와 postValue 메소드를 노출하는데 라이브데이터에 있는 값을 수정하고 싶다면, 이 메소드들을 사용해야 한다.

button.setOnClickListener {
    val anotherName = "John Doe"
    model.currentName.setValue(anotherName)
}

LiveData 를 확장하기

라이프사이클이 Started나 Resumed일 때를 처리할 수 있다. 만약 라이브 데이터가 활성화된 옵저버를 가지고 있지 않다면 Inactive()가 불린다.

class StockLiveData(symbol: String) : LiveData<BigDecimal>() {
    private val stockManager = StockManager(symbol)

    private val listener = { price: BigDecimal ->
        value = price
    }

    override fun onActive() {
        stockManager.requestPriceUpdates(listener)
    }

    override fun onInactive() {
        stockManager.removeUpdates(listener)
    }
}

ViewModel

ViewModel 이란?

액티비티나 프래그먼트의 데이터를 준비하고 매니징하기 위한 클래스이다. 뷰모델은 액티비티나 프래그먼트의 커뮤니케이션을 핸들링 하기도 한다.

뷰모델은 항상 액티비티/프래그먼트의 스코프와 함께 생성되고 그 스코프가 활성화 있는 한 지속된다.

다른말로 하면, 뷰에 컨피그레이션이 변경되지 않는 이상은 뷰모델이 파괴되지 않는다는 것을 뜻한다.

뷰모델의 목적은 액티비티나 프래그먼트를 위한 정보를 유지하기 위한것이다.
액티비티나 프래그먼트는 뷰모델에서의 변경을 감지할수 있다. 뷰모델은 보통 이런 정보를 LiveData 나, Data Binding 을 통하여 노출한다.

뷰모델은 UI의 데이터를 관리한다.

뷰모델이서는 무조건 뷰(Activity, Fragment) 에 대한 접근을 가지고 있으면 안된다!

아래는 뷰모델을 만드는 예시이다.

 public class UserModel extends ViewModel {
     private final MutableLiveData<User> userLiveData = new MutableLiveData<>();

     public LiveData<User> getUser() {
         return userLiveData;
     }

     public UserModel() {
         // trigger user load.
     }

     void doAction() {
         // depending on the action, do necessary business logic calls and update the
         // userLiveData.
     }
 }

각각의 프래그먼트는 뷰모델을 액티비티의 같은 키를 사용하여 받아올 수 있다. 이런 방법은 프래그먼트들 사이의 커뮤니케이션을 가능하게 하고, 프래그먼트가 직접 통신하지 않도록 하여 결합도를 줄여준다.

 public class MyFragment extends Fragment {
     public void onStart() {
         UserModel userModel = ViewModelProviders.of(getActivity()).get(UserModel.class);
     }
 }