Обработчик () postDelay недоступен для этого кода Котлина, как его исправить?

У меня есть функция, где я просто явно хочу отложить возвращаемое значение

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. Как я могу исправить это, чтобы иметь задержку в 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()) вашего исходного кода примера (который я сохранил для этих примеров) поместит выполнение оператора when а также обратные вызовы после этого назад на основной поток.