对于这个Kotlin代码,Handler()postDelay是无法访问的,如何解决?

时间:2017-07-09 14:04:03

标签: android 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无法访问,因此不会触发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或抛出异常?

1 个答案:

答案 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")
    }
}

使用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())部分(我为这些示例保留的部分)将执行when语句以及之后回调在主线程上的回调。