@foonfyrick

IlegalStateException system services not available to activities before oncreate()?

Ошибка при создании базы данных, ошибку я решил, но не могу понять почему она происходит.
llegalStateException: System services not available to Activities before onCreate(), ошибка указывает на класс MyRepository, как только я его удаляю и переношу весь код в MainActivity, все начинает работать правильно.

@Dao
interface MyDao {
    @Insert(onConflict = OnConflictStrategy.ABORT)
    fun insert(user: User)
}

@Database(entities = [User::class],version = 1,exportSchema = true)
abstract class MyDatabase:RoomDatabase() {
    abstract fun getDao(): MyDao

    companion object{
        private var INSTANCE:MyDatabase?=null
        fun getInstance(context: Context):MyDatabase?{
            val tempInstance = INSTANCE
            return if (tempInstance!=null){
                tempInstance
            } else{
                val database = Room.databaseBuilder(
                    context,
                    MyDatabase::class.java,
                    "db"
                ).build()
                INSTANCE = database
                INSTANCE
            }
        }
    }
}

class MyRepository(context: Context) {
    private val getMyDao = MyDatabase.getInstance(context)?.getDao()

    fun insert(user: User) = getMyDao?.insert(user)

}

class MainActivity : AppCompatActivity() {
    val repository = MyRepository(this)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        Thread{
            val result=repository.insert(User(0,"qwe"))
           
            Log.e("RESULT:",result.toString())
        }.start()

    }
    
}
  • Вопрос задан
  • 169 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Android
Android developer at Yandex
Ты создаёшь репозиторий при создании активити (фактически, в её конструкторе). Внутри ты создаёшь Room, который, очевидно, пытается из контекста (который и есть активити, которая в это время только создаётся) взять system service (getSystemService). Это незаконно, потому что активити становится годной к работе только во время выполнения onCreate. Ничего делать в ней до этого не нужно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы