处理程序()postDelay无法访问此Kotlin代码,如何解决它?

我有一个函数,我只是明确地要延迟返回值

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是不可达的,因此3秒的延迟是不会触发的。

为了使它可达,我必须添加额外的括号

 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值了。 我怎么能解决这个延迟3秒,而我仍然可以返回相应的DataModel或抛出异常?

如果您只想阻止当前线程,则可以使用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") } } 

一个使用HandlerRunnable的例子,用一个单独的回调函数:

 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())Handler(Looper.getMainLooper())部分将执行when语句以及之后的回调回到主线程。