Обработчик () 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 а также обратные вызовы после этого назад на основной поток.

  • Ссылка на представления с одним и тем же идентификатором в разных макетах с расширением android kotlin
  • Вложить только определенные параметры в конструктор
  • Kotlin by Lazy в пользовательских представлениях
  • LiveData.addSource onChanged событие, не вызывающее Android
  • Ошибка комнаты в Android: TypeConverter не распознается для списка перечислений
  • Получение ошибки при работе с геттером и сеттером в котлине
  • Ссылка на свойства класса Observable в макете привязки данных Android
  • Android Room выберите многие из многих LiveData
  • Проект Android Kotlin не смог синхронизировать проект Gradle
  • Как создать наблюдаемый список в kotlin
  • Как запустить другой файл .kt / Class в той же папке src?
  • Давайте будем гением компьютера.