Android: как получить доступ к методу await () в библиотеке Ion - PullRequest
0 голосов
/ 20 мая 2018

Я использую ion , библиотеку для Android.Как показано в ion-kotlin , можно использовать метод с именем await(), например, так:

fun getFiles(files: Array<String>) = async {
    for (file in files) {
        Ion.with(context)
        .load(file)
        .asString()
        .await()
    }
}

Я скопировал и вставил эту точную функцию в мой класс MainActivity в качестве теста.,Тем не менее, я получил ошибку «неразрешенная ссылка: ожидание» в Android Studio.

Это сбивало с толку, потому что файл build.gradle моего приложения имеет следующие две строки:

implementation 'com.koushikdutta.ion:ion:2.+'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:0.22.5'

Это подводит меня к моему первому вопросу, как я могу использовать метод .await() вИонная библиотека?

Я подумал, что, возможно, мне пришлось вручную загрузить AsyncAwait.kt , который был единственным файлом в исходной папке ion-kotlin .

Итак, я скачал этот файл и поместил его в пакет моего проекта.Я изменил объявление пакета в верхней части загруженного файла с package com.koushikdutta.ion.kotlin на package com.example.vroy1.recylerviewtest.

Это, казалось, частично решило проблему, потому что у меня больше не было ошибки «неразрешенная ссылка: ожидание» в Android Studio.

Но файл AsyncAwait.kt отказывается компилироваться.Я получаю несколько ошибок.

Одна из ошибок происходит в операторе импорта в верхней части файла.Ошибка:

Screen_Shot

Это подводит меня ко второму вопросу.Если единственный способ использовать .await() - это вручную загрузить AsyncAwait.kt, как я могу исправить эту ошибку, чтобы файл скомпилировался?

1 Ответ

0 голосов
/ 20 мая 2018

Я бы предложил вам определить некоторую функцию Utility, например, такую:

suspend fun <T> customAsync(block: suspend CoroutineScope.() -> T): Deferred<T> {
  val deferred: Deferred<T> = async(CommonPool) { block() }
  return deferred
}

suspend fun <T> asyncAwait(block: suspend CoroutineScope.() -> T): T = customAsync(block).await()

, а затем вы можете определить функцию getFiles () обычным способом (нет необходимости делать ее асинхронной), и если вы хотитевыполнить его в другом потоке, затем вызвать эту функцию внутри asyncAwait {} , как это

 launch(UI) {
    val result = asyncAwait {
      getFiles(listOfStrings)
    }
  }
...