简体   繁体   English

Kotlin 中的异步匿名函数? (拉姆达表达式)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM