본문 바로가기

개발 노트/Kotlin

[에러] java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

[오류코드]

java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.

 

 

해당 오류는 Main스레드에서 Room데이터베이스 접근에 시도했을때 발생하는 에러다.

안드로이드에서는 Main스레드에서 시간이 오래걸리는 작업을하면(데이터베이스에 접근하는것 등)  Main스레드가 블록될수있기 때문에 피하는것을 권장한다.

Main스레드가 블록되면 앱이 꺼지는 큰오류가 발생할 수 있기 때문에, 사용자측면에서 굉장히 치명적이기 때문이다.

 

 

나는 ViewModel을 통해서 Room데이터베이스를 가져오는 코드를 작성했는데 이부분에서 해당 오류가 발생하였다.

viewModelScope를 사용해서 비동기적으로 Room데이터를 가져오는데, 해당 데이터를 가져올떄 Main스레드에서 실행되기 때문에 위와같은 오류가 발생한 것이였다.

// 수정전 코드
fun saveData(likeEntity: LikeEntity) = viewModelScope.launch {
    shelterDao.insertData(likeEntity)
}

 

 

Dispatchers.IO로 설정해서 메인스레드가 아닌 IO스레드에서 데이터베이스를 받아오도록 수정했다.

// 수정 후 코드
fun saveData(likeEntity: LikeEntity) = viewModelScope.launch {
    withContext(Dispatchers.IO){
        shelterDao.insertData(likeEntity)
    }
}