Android

LiveData 맛보기

까망사과 2023. 2. 28. 02:00

LiveData는 관찰자 패턴을 사용하여 데이터 변경을 다른 컴포넌트에 알릴 수 있는 데이터 홀더다.

ViewModel 및 데이터 바인딩과 함께 사용하는 것이 일반적이다.

 

👍 LiveData의 장점

  • 수명주기를 인식한다.
    LiveData는 자신을 관찰하는 컴포넌트의 수명주기를 인식한다.
    해당 컴포넌트의 수명주기가 활성 상태(STARTED 또는 RESUMED)이면 데이터 업데이트를 알린다.
    반대로 비활성 상태이면 업데이트를 수신하지 않고 활성 상태로 전환됐을 때 수신한다.
  • 메모리 누수가 없다.
    LiveData가 업데이트될 때 실행되는 콜백은 연결된 수명주기가 끝날 때 자동으로 삭제된다.

 

📦 LiveData 사용해보기

LiveData 객체 생성하기

LiveData는 추상 클래스이므로 서브클래스인 MutableLiveData의 생성자를 호출한다.

이 때 타입 파라미터로 보관할 데이터의 타입을 지정한다.

일반적으로 아래처럼 외부에서는 값을 변경하지 못하도록 백킹 프로퍼티를 사용한다.

data class User(
    name: String,
    age: Int
)

class UserViewModel : ViewModel() {
    
    private val _user = MutableLiveData<User>()
    val user: LiveData<User>
        get() = _user

    ...
}

 

LiveData의 값 변경하기

MutableLiveData<T>의 다음 메서드를 호출하여 값을 변경할 수 있다.

  • setValue(T)
    메인 스레드에서 값을 변경한다.
  • postValue(T)
    백그라운드 스레드에서 값을 변경한다.

MutableLiveData 클래스에서 위 메서드들은 접근 제한자가 public이기 때문에 외부에서 자유롭게 값을 변경할 수 있는 반면, LiveData 클래스에서는 protected이기 때문에 값을 변경할 수 없다.

class UserViewModel : ViewModel() {
    
    private val _user = MutableLiveData<User>()
    val user: LiveData<User>
        get() = _user
        
    _user.value = User(
        name = "John"
        age = 27
    )
    
    ...
}

 

LiveData 관찰하기

LiveData를 관찰하려면 observe(LifecycleOwner, Observer) 메서드를 호출한다.

이 메서드의 파라미터는 다음과 같다.

  • LifecycleOwner
    LiveData가 인식하는 수명주기를 소유하는 인터페이스다.
    FragmentActivity, Fragment LifecycleOwner를 구현하는 클래스다.
  • Observer
    LiveData의 값이 변경되면 호출되는 onChanged 콜백을 포함한다.
class UserActivity : AppCompatActivity() {

    private val viewModel: UserViewModel by viewModels()
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        
        val observer = object: Observer<User> { user ->
            Toast.makeText(
                this,
                "이름은 ${user.name}, ${user.age}세입니다.",
                Toast.LENGTH_SHORT
            ).show()
        }
        viewModel.user.observe(
            this,
            observer
        )
    }
    
    ...
}

'Android' 카테고리의 다른 글

ViewModel 맛보기  (0) 2023.02.27
Retrofit2로 JSON 데이터 요청하기  (0) 2023.02.21
WorkManager (4) : 작업 체이닝  (0) 2022.12.10
WorkManager (3) : 작업 관리하기  (0) 2022.12.05
WorkManager (2) : 작업 상태  (0) 2022.12.02