我有一个函数,我只是明确地想要延迟返回值
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)
}
但是,我不能再返回DataModel值了。我怎么能解决这个延迟3s,而我仍然可以返回相应的DataModel或抛出异常?
答案 0 :(得分:2)
如果您只想阻止当前线程,可以使用Thread.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
}
}
请注意,这些示例不会阻止任何线程,原始示例代码的Handler(Looper.getMainLooper())
部分(我为这些示例保留的部分)将执行when
语句以及之后回调在主线程上的回调。