Kotlin:执行函数存储在变量中

时间:2019-04-12 10:21:12

标签: android kotlin lambda higher-order-functions

我试图在first_job_month中创建一个函数,该函数需要一段代码,如果应用程序位于前台,则执行该函数,否则将其存储在变量中,并在下次应用程序进入前台时执行。

我到目前为止所做的事情:

months_since_first_order

我将函数称为:

Kotlin

我面临的问题:

如果应用程序处于前台状态,并且我调用了class MainActivity : AppCompatActivity() { private var appInBackground = false private var codeBlock: Any? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } override fun onResume() { super.onResume() appInBackground = false if (codeBlock!=null) performOperations { codeBlock } } override fun onSaveInstanceState(outState: Bundle?) { super.onSaveInstanceState(outState) appInBackground = true } fun performOperations(block: () -> Unit) { if (appInBackground) codeBlock = block else { block() codeBlock=null } } } 方法,则将执行作为参数传递的代码块。但是,如果我将代码块存储在变量中并尝试在mainActivity.performOperations { val fm=mainActivity.supportFragmentManager for (i in 0 until fm.backStackEntryCount) fm.popBackStackImmediate() } 上调用performOperations方法,则代码块将不会执行。

PS:我是高阶函数和Lambda的初学者。

1 个答案:

答案 0 :(得分:1)

如评论中所述,我不建议您遵循此模式来解决您的问题。 LiveData / ViewModel绝对是首选的解决方案,因此长时间运行的事件可以在UI之外的生命周期中持续存在,并且仅在可见Activity时才提供结果。

也就是说,要回答这个问题,您需要将代码块存储为一个函数,以便可以调用它。在您的performOperations方法中,您输入了() -> Unit类型的参数,但将其存储为Any?。前者可以被调用,而后者不能(实际上可以是任何类型)。

要修复,可以将其更改为:

private var codeBlock: (() -> Unit)? = null

并调用:

codeBlock?.invoke()