Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Method addObserver must be called on the main thread Exception, While inserting data to room database

I am trying to insert data into the room database using the kotlin coroutine. But I always get an exception java.lang.IllegalStateException: Method addObserver must be called on the main thread But I don't have an observer in this code, the insert call is called from launch with Dispatchers IO

DocumentDao.kt

@Dao
interface DocumentDao {
        @Insert
        suspend fun insertDocument(document: Document): Long
    }

Repository.kt

class Repository@Inject constructor(val db: MyDB) {
    suspend fun demoInsert(
        uri: String,
        albumId: Long
    ): Long {
        val newDoc = Document(0, albumId, rawUri = uri)
        return db.documentDao().insertDocument(newDoc)
    }
}

MyViewModel.kt

@HiltViewModel
class MyViewModel@Inject constructor(val repo: Repository) : ViewModel() {

    suspend fun demoInsert(
        uri: String,
        albumId: Long
    ): Long {

        return repo.demoInsert(uri, albumId)
    }
}

MyFrag.kt

@AndroidEntryPoint
class MyFrag: Fragment() {
 val viewModel: MyViewModel by viewModels()
....
....
   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
         binding.insert.setOnClickListener {
               lifecycleScope.launch(Dispatchers.IO) {
                  val res =  viewModel.demoInsert("test", Random.nextLong(500))
                 Log.d(TAG, "onViewCreated: $res")
           }
     }
    
........
.......
}

}

what is wrong with this code? please help me

like image 430
d-feverx Avatar asked Sep 07 '25 01:09

d-feverx


1 Answers

I'm not sure about this but you can launch coroutine inside listener with Main Dispatcher and later use withContext inside DB function, to change context.

like image 114
mikolaj-jalocha Avatar answered Sep 11 '25 02:09

mikolaj-jalocha



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!