如何从演示者访问活动上下文?

问题描述 投票:0回答:1

我有一个带有计算的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 ..

如何将结果转发回查看/活动?

android android-fragments android-activity kotlin android-fragmentactivity
1个回答
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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.