Kotlin: выполнение функции, хранящейся в переменной - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь создать функцию в 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, выполняется блок кода, переданный в качестве аргумента. Но если я сохраню блок кода в переменной и попытаюсь вызвать метод performOperations для onResume, блок кода не будет выполнен.

P.S .: В моем коде могут быть ошибки, потому что я новичок в функциях и лямбдах высшего порядка.

1 Ответ

1 голос
/ 12 апреля 2019

Как указано в комментариях, я бы не рекомендовал следовать этой схеме, чтобы решить вашу проблему.LiveData / ViewModel, безусловно, является предпочтительным решением, так что ваши долгосрочные события могут сохраняться в жизненном цикле за пределами вашего пользовательского интерфейса и доставлять результат только тогда, когда ваша активность видима.

Тем не менее, чтобы ответить на вопрос, вам нужно сохранить блок кода как функцию, чтобы вы могли вызывать его.В вашем методе performOperations вы берете параметр типа () -> Unit, но сохраняете его как Any?.Первый может быть вызван, в то время как последний не может (это может быть буквально любого типа).

Чтобы исправить, вы можете изменить его на:

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

И вызвать с помощью:

codeBlock?.invoke()
...