处理程序()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") } }
一个使用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())
的Handler(Looper.getMainLooper())
部分将执行when
语句以及之后的回调回到主线程。