我有一个带有计算的Activity,为了简单起见,我在MVP模式中提取了该Activity的功能:
之前我在一个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
..
如何将结果转发回查看/活动?
您可以通过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()
}
}