Kotlin 启动协同程序的单一方法
我有一个与RoomDB对话的StorageRepository,还可以共享Pref。我希望这种通信通过IO线程上的单个方法进行。我一直这样做到现在-Kotlin 启动协同程序的单一方法,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我有一个与RoomDB对话的StorageRepository,还可以共享Pref。我希望这种通信通过IO线程上的单个方法进行。我一直这样做到现在- class StorageRepository(private val coroutineDispatcher: CoroutineContext = Dispatchers.Main ) : CoroutineScope { private val job = Job() override val coroutineConte
class StorageRepository(private val coroutineDispatcher: CoroutineContext = Dispatchers.Main
) : CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
get() = job + coroutineDispatcher
override fun storeUserDetails(userDetails: UserDetails) {
roomDB.store(userDetails)
}
override fun storeTimeStamp(timeStamp: String) {
sharedPrefs.store(timeStamp)
}
private fun executeAllOpsOnIOThread() = launch {
withContext(Dispatchers.IO) {
//Any DB write, read operations to be done here
}
}
}
我的问题是如何将roomDB.storeuserDetails和sharedPrefs.storetimeStamp传递给executeAllOpsOnIOThread,以便所有的DB通信都在IO线程上进行?嗯。。也许我误解了您的意思,但似乎您可以将一段代码作为lambda函数传递,如下所示:
class StorageRepository(
private val coroutineDispatcher: CoroutineContext = Dispatchers.Main
) : CoroutineScope {
private val job = Job()
override val coroutineContext: CoroutineContext
get() = job + coroutineDispatcher
override fun storeUserDetails(userDetails: UserDetails) = executeAllOpsOnIOThread {
roomDB.store(userDetails)
}
override fun storeTimeStamp(timeStamp: String) = executeAllOpsOnIOThread {
sharedPrefs.store(timeStamp)
}
private fun executeAllOpsOnIOThread(block: () -> Unit) = launch {
withContext(Dispatchers.IO) {
block()
}
}
//async get
fun getTimestamp(): Deferred<String> = getOnIOThread { sharedPrefs.getTime() }
private fun <T> getOnIOThread(block: () -> T):Deferred<T> = async {
withContext(Dispatchers.IO) {
block()
}
}
}
谢谢,这很好:但是当我有一个read方法返回一个值时,它是如何工作的呢。。。例如returnTimeStamp我喜欢这个val-timestamp=executeAllOpsOnIOThread{sharedPrefs.getTime}返回时间戳,但它说需要返回字符串,但找到了JobCool!谢谢,这是最后一个问题,对不起。有了这个Deferred,如果我使用wait来获取实际的字符串,它表示我只能使用wait from suspend函数。我怎么能这么做?对不起我自己找到的: