我试图在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的初学者。
答案 0 :(得分:1)
如评论中所述,我不建议您遵循此模式来解决您的问题。 LiveData / ViewModel绝对是首选的解决方案,因此长时间运行的事件可以在UI之外的生命周期中持续存在,并且仅在可见Activity时才提供结果。
也就是说,要回答这个问题,您需要将代码块存储为一个函数,以便可以调用它。在您的performOperations
方法中,您输入了() -> Unit
类型的参数,但将其存储为Any?
。前者可以被调用,而后者不能(实际上可以是任何类型)。
要修复,可以将其更改为:
private var codeBlock: (() -> Unit)? = null
并调用:
codeBlock?.invoke()