【问题标题】:How to access activity context from presenter?如何从演示者访问活动上下文?
【发布时间】:2019-03-20 22:50:50
【问题描述】:

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

  1. 计算活动
  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】:

您可以通过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()
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-31
    • 2020-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    相关资源
    最近更新 更多