Android 此Kotlin代码无法访问Handler()postDelay,如何修复它?
我有一个函数,其中我只想显式地延迟返回值Android 此Kotlin代码无法访问Handler()postDelay,如何修复它?,android,kotlin,Android,Kotlin,我有一个函数,其中我只想显式地延迟返回值 private fun loadData(): DataModel? { Handler(Looper.getMainLooper()).postDelayed( when (fetchStyle) { FetchStyle.FETCH_SUCCESS -> return DataModel("Data Loaded") FetchStyle.FETCH_EMPTY -> return Data
private fun loadData(): DataModel? {
Handler(Looper.getMainLooper()).postDelayed(
when (fetchStyle) {
FetchStyle.FETCH_SUCCESS -> return DataModel("Data Loaded")
FetchStyle.FETCH_EMPTY -> return DataModel("")
FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching")
}, 3000)
}
但是,有一个警告状态是无法到达postDelayed
,因此不会触发3s延迟
为了便于访问,我必须在其周围添加额外的括号
private fun loadData(): DataModel? {
Handler(Looper.getMainLooper()).postDelayed({
when (fetchStyle) {
FetchStyle.FETCH_SUCCESS -> DataModel("Data Loaded")
FetchStyle.FETCH_EMPTY -> DataModel("")
FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching")
}}, 3000)
}
但是,我不能再返回数据模型值了。我如何修复此问题,使其延迟为3秒,而我仍然可以返回相应的数据模型或引发异常?如果您只想阻止当前线程,可以使用
线程。sleep
:
private fun loadData(): DataModel? {
Thread.sleep(3000);
return when (fetchStyle) {
FetchStyle.FETCH_SUCCESS -> DataModel("Data Loaded")
FetchStyle.FETCH_EMPTY -> DataModel("")
FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching")
}
}
使用
Handler
和Runnable
来替代单独的回调函数的示例:
private fun loadData(): DataModel? {
Handler(Looper.getMainLooper()).postDelayed({
val result = when (fetchStyle) {
FetchStyle.FETCH_SUCCESS -> DataModel("Data Loaded")
FetchStyle.FETCH_EMPTY -> DataModel("")
FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching")
}
loadDataCallback(result)
}, 3000)
}
fun useLoadData() {
loadData()
}
private fun loadDataCallback(dataModel: DataModel?) {
// use result here
}
更类似于Kotlin的方法,将函数作为回调传递:
private fun loadData(callback: (DataModel?) -> Unit): DataModel? {
Handler(Looper.getMainLooper()).postDelayed({
val result = when (fetchStyle) {
FetchStyle.FETCH_SUCCESS -> DataModel("Data Loaded")
FetchStyle.FETCH_EMPTY -> DataModel("")
FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching")
}
callback(result)
}, 3000)
}
fun useLoadData() {
loadData { dataModel ->
// use result here
}
}
请注意,这些示例不会阻止任何线程,原始示例代码(我为这些示例保留的)的
处理程序(Looper.getMainLooper())
部分会将when
语句的执行以及之后的回调放回主线程上。我不确定您在这里想要实现什么。在从loadData
方法返回DataModel
之前,您是否尝试等待3秒钟?执行此操作时是否要阻止当前线程?您计划如何实际调用此函数?是的,尝试等待3秒钟,然后从loadData返回数据模型。阻塞正在运行的线程没关系。这解决了我的问题,谢谢!要知道Runnable不可能返回某些内容。我想知道是否有办法做到这一点?我已经添加了一些使用Handler
和Runnable
的示例。