我有一个带有计算的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
在该处。
如何将结果转发回视图/活动?
答案 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()
}
}