Как обернуть асинхронную Java-библиотеку в Android Kotlin? - PullRequest
1 голос
/ 02 ноября 2019

Я бы хотел использовать библиотеку Java внутри моего приложения Kotlin для Android, но я относительно новичок в Kotlin и мне нужен совет. Библиотека в основном выглядит так:

public interface Listener{
    void onResult(Result res)
}

public class Client{
    public Client(){}
    public void setListener(Listener l){}
    public void start(){} // Starts Thread(s) (so it's non-blocking), does some server calls, computes result, calls listener.onResult(res) after computation is finished.
    public void cancel(){} 
}

Да, я знаю, я мог бы просто вызывать функции напрямую и использовать их как в Java, но так ли это по-котлински? Я прочитал, что выполнение аналогичной задачи (с использованием асинхронной функции, которая принимает параметр обратного вызова) будет выполнено путем ее оборачивания в структуру функции сопрограммы / приостановки. Но я не знаю, как адаптировать это для моей проблемы (?) Или это неправильный подход?

1 Ответ

2 голосов
/ 02 ноября 2019

Если вы хотите превратить это в удобную и простую функцию приостановки Kotlin, она будет выглядеть следующим образом:

suspend fun doTheThing() : Result {
    val c = Client()
    try {
        //suspend until the listener fires or we're cancelled
        return suspendCancellableCoroutine {
            cont ->
            c.setListener {
                result -> cont.resume(result)
            }
            c.start()
        }
    } catch (e: Exception) {
        // If someone cancels the parent job, our job will complete exceptionally
        // before the client is done.  Cancel the client since we don't need it
        // anymore
        c.cancel()
        throw e
    }
}

Я не вижу в вашем интерфейсе способа, чтобы клиент мог указать на ошибку. Если это часть Result, то вы, вероятно, захотите превратить это в исключение в слушателе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...