[英]Asynchronous anonymous function in Kotlin? (lambda expressions)
I'm making a listview (android) what call function when click.我正在制作一个列表视图(android)点击时调用什么函数。
and I want to get function is async or sync
. I want to get function is async or sync
。
to block when it is async.在异步时阻塞。
and even i want to know how attach async mark to kotlin lambda expression
.甚至我想知道
how attach async mark to kotlin lambda expression
。
class FunctionCaller_Content(text: List<String>,
val function: List< /*suspend? @async? */
( () -> Unit )?
>? = null)
/* I want both of async, sync function. */
{
fun isAsnyc(order: Int): Boolean
= // how to get this lambda expression{function?.get(order)} is async?
fun call(callerActivity: Activity, order: Int) {
val fun = function?.get(order)
fun()
if(isAsync(fun))
/* block click for async func */
}
}
and usage.和用法。
FunctionCaller_Content( listOf("Click to Toast1", "Click to Nothing"),
listOf(
{
Toast.makeText(this, "clicked", Toast.LENGTH_SHORT)
},
{
/*if async lambda expression, how can i do?*/
} )
You can have List<suspend () -> Unit>
, but you can't have both suspend and non-suspend functions in the same list except by using List<Any>
.您可以拥有
List<suspend () -> Unit>
,但您不能在同一个列表中同时拥有挂起和非挂起功能,除非使用List<Any>
。 I'd suggest using two separate lists instead.我建议改用两个单独的列表。 Another solution is to use "algebraic data type":
另一种解决方案是使用“代数数据类型”:
sealed class SyncOrAsync // can add methods here
class Sync(val f: () -> Unit) : SyncOrAsync
class Async(val f: suspend () -> Unit) : SyncOrAsync
class FunctionCaller_Content(text: List<String>,
val function: List<SyncOrAsync>? = null)
{
fun call(callerActivity: Activity, order: Int) {
val fun = function?.get(order)
if(fun is Async)
/* block click for async func */
}
}
FunctionCaller_Content(
listOf("Click to Toast1", "Click to Nothing"),
listOf(Sync {
Toast.makeText(this, "clicked", Toast.LENGTH_SHORT)
},
Async {
// your async code
})
But if you are just going to block anyway, I would just use List<() -> Unit>
and但是,如果您无论如何都要阻止,我只会使用
List<() -> Unit>
和
listOf({
Toast.makeText(this, "clicked", Toast.LENGTH_SHORT)
},
{
runBlocking {
// your async code
}
})
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.