如何从主持人访问活动上下文?

时间:2019-03-20 22:50:51

标签: android android-fragments android-activity kotlin android-fragmentactivity

我有一个带有计算的Activity,为简单起见,我以MVP模式提取了该Activity的功能:

  1. CalcActivity
  2. CalcPresenter

之前,我将所有计算都放在一个CalcActivity中。在该活动中,我做了一些计算:

private fun Calculator.doCalculation() {
    this.complexCalcualtion(intArrayOf(1, 2, 3, 4, 5, 6), object : CalculationCallback {
        override fun onSuccess(result: String) {
           runOnUiThread {
                result_textview.text = result
           }
        }
    })
}

我猜这整个doCalculation()是在另一个线程上完成的。我将此方法移至演示者,并希望转发结果以供查看:

private fun Calculator.doCalculation() {
    this.complexCalcualtion(intArrayOf(1, 2, 3, 4, 5, 6), object : CalculationCallback {
        override fun onSuccess(result: String) {
            view?.showResult(result)
        }
    })
}

但是查看?从未调用过,因为它在CalculationCallback.onSuccess()中为空,我在那里看不到view

我也无法在该处进行活动,因此我无法runOnUiThread在该处。

如何将结果转发回视图/活动?

1 个答案:

答案 0 :(得分:1)

您可以通过LiveData传递计算结果。该工具与活动生命周期集成在一起,当活动(及其视图)处于活动状态时,将交付您的数据。

您可以这样实现计算器:

class Calculator {

    private val resultLiveData = MutableLiveData<String>().apply { value = "" }
    // expose result as live data
    val result: LiveData<String> = resultLiveData

    fun calculate(input: String) {
        // calculation in worker thread
        // ...
        // return result for live data observers
        resultLiveData.postValue("$input CALCULATED!")
    }

    fun cancel() {
        // depending on background worker
    }
}

并在活动(或片段)中使用它

class MyActivity : Activity() {

    private val calculator = Calculator()

    override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) {
        super.onCreate(savedInstanceState, persistentState)
        calculator.result.observe(this::getLifecycle) { result ->
            // setup result in your view
            text_view.text = result
        }
    }

    override fun onStart() {
        super.onStart()
        calculator.calculate("Input data")
    }

    override fun onStop() {
        super.onStop()
        calculator.cancel()
    }
}