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

How to access activity context from presenter?

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

  1. 计算Activity
  2. CalcPresenter

之前我在一个 CalcActivity 中完成了所有计算。我在那里做了一些计算 activity:

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

我也无法访问那里的 activity,所以我不能在那里 runOnUiThread..

如何将我的结果转发回 view/activity?

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

您可以像这样实现您的计算器:

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
    }
}

并在activity(或片段)

中使用它
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()
    }
}