如何使用Kotlin异步并等待阶乘?

时间:2017-11-03 11:16:09

标签: android asynchronous kotlin

我在Kotlin(Android应用程序)中有这个功能:

tailrec fun factorial(n: BigInteger, remainder: BigInteger = BigInteger.ONE) : BigInteger{
    if(n== BigInteger.ZERO)
        return remainder
    else {
        return factorial(n - BigInteger.ONE, remainder * n)
    }
}

这个简单的代码:

button.setOnClickListener {
        val n = editTextT.text.toString()
        val result: BigInteger = factorial(BigInteger(n))
        textView.text = "$n! is $result"
    }

我的问题是:有没有办法以异步方式进行这种计算?如果是,怎么样?

1 个答案:

答案 0 :(得分:1)

由于Anko支持协程(在this article中描述),你可以运行一个协程来执行UI线程中的代码但运行并等待后台操作,在你的情况下它看起来像:

button.setOnClickListener {
    val n = editTextT.text.toString()
    async(UI) {
        val result: Deferred<BigInteger> = bg { factorial(BigInteger(n)) }
        textView.text = "$n! is ${result.await()}"
    }
}

另请参阅:Anko reference