В настоящее время я разрабатываю базу данных для мобильного приложения. Недавно я нашел очень полезную функцию для доступа к базе данных в фоновом режиме:
private val IO_EXECUTOR = Executors.newSingleThreadExecutor()
fun ioThread(f : () -> Unit) {
IO_EXECUTOR.execute(f)
}
Кроме того, я выяснил, что код синхронизации не нужен, так как к базе данных будет обращаться только в одном потоке (то есть в потоке, используемом SingleThreadExecutor
).
Единственная проблема заключается в том, что следующие методы должны быть ограничены, чтобы вызываться только через функцию ioThread
(или с использованием IO_EXECUTOR
).
abstract class MyDatabase : RoomDatabase() {
companion object {
fun init(context: Context) { ... }
fun getInstance() { ... }
}
Можно ли добиться этого за Kotlin
/ Java
?
ОБНОВЛЕНИЕ: на данный момент у меня есть эта реализация, но думаю, что должны быть лучше
// App.kt file
private val IO_EXECUTOR = Executors.newSingleThreadExecutor()
private var IO_THREAD_ID: Long = -1L
private fun getIOThreadId(): Long {
if (IO_THREAD_ID == -1L)
IO_THREAD_ID = IO_EXECUTOR.submit(Callable<Long> { Thread.currentThread().id }).get()
return IO_THREAD_ID
}
fun notInIOThread() = Thread.currentThread().id != getIOThreadId()
fun ioThread(f : () -> Unit) {
IO_EXECUTOR.execute(f)
}
и затем использовать notInIOThread()
в init()
и getInstance()
функциях