Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 此Kotlin代码无法访问Handler()postDelay,如何修复它?_Android_Kotlin - Fatal编程技术网

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
的示例。