Android

[Android] MediatorLiveData가 동작하지 않을 때

728x90

 

 

안드로이드 프로젝트를 진행하며 MediatorLiveData를 처음 사용해보았다.

MediatorLiveData는 한 개 이상의 LiveData를 데이터 소스에 추가하여 관찰할 수 있다.

이번 글에서는 오늘 겪었던 문제점과 LiveData와 MediatorLiveData의 개념을 다시 한번 정리해보고자 한다.

 

 

간단한 사용자의 정보를 가지고 있는 UserEntity와 모든 사용자의 정보를 조회하는 getAllUsers() 메서드가 들어있는 UserDao가 있다고 해보자.

UserEntity

@Entity(tableName = "user")
class UserEntity {
    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    var id: Long = 0
  
    @ColumnInfo(name = "name")
    var name: String? = null
  
    constructor()
  
    @Ignore
    constructor(name: String) : this(0, name)
}

 

UserDao

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAllUsers(): LiveData<List<UserEntity>>
}

 

이때 mediatorLiveData를 사용해서 User 정보를 가져오는 ViewModel이 있다.

MyViewModel

class MyViewModel(application: Application): AndroidViewModel(application) {
    private val _user = MediatorLiveData<UserEntity>()
  
    val user = LiveData<UserEntity>
        get() = _user
  
    init {
        _user.value = null
      
        loadUser()
    }
  
    private fun loadUser() {
        val userDao = Database.getInstance(getApplication()).userDao()
      
        val userList = userDao.getAllUsers()
      
        _user.addSource(userList) { list ->
            println(list) // 1번 프린트
            list?.let{
                _user.value = it[0]
            }
        }
    }
}

 

Database의 인스턴스를 가져와 UserDao 객체를 가져오고, UserDao의 getAllUsers() 메서드를 사용해서 모든 사용자의 정보를 가져온다.

가져온 userList를 MediatorLiveData의 데이터 소스로 추가하여 값을 확인하려 한다.

 

 

여기서 onChange 메서드에서 값이 제대로 가져와지나 확인해보려고 결과 list를 프린트해봤지만 값이 나오지 않았다.

코드적으로 이상이 없어 보였는데 왜 값이 안 나올까 고민 한참 하고 구글링을 해본 결과, MyActivity에서 활성 옵저버를 연결해주지 않아서였다. (참고)

MyActivity

class MyActivity(): AppCompatActivity() {
    private val myViewModel = MyViewModel()
  
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
      
        myViewModel.user.observe(this, Observer { user ->
            println(user) // 2번 프린트
        })
    }
}

 

LiveData는 LifecycleOwner의 상태가 활성화 상태일 때만 옵저버에게 데이터 변화를 알려주고, 비활성화 상태일 때는 LiveData도 자동으로 소멸된다.

여기서는 활성 옵저버를 user에 연결해주지 않았기 때문에 addSource 메서드로 데이터 소스를 추가해줘도 콜백 함수가 동작하지 않았다.

addSource 메서드는 이상이 없지만, 활성 옵저버를 연결해주지 않았기 때문에 동작하지 않았던 것이다.

MyActivity에서 Observer를 걸어주면 순차적으로 1번이 프린트된 후, 2번이 프린트되는 것을 확인할 수 있다.

 

LiveData의 개념을 충분히 공부했었다면 바로 알아차렸을만한 문제였는데, LifeCycleOwner와 Observer의 개념에 대해 익숙지 않았던 것 같다.

나 같은 안드로이드 초보자에게 도움이 되었으면 한다.

728x90