Android 如何从演示者访问活动上下文?
我有一个带有计算的活动,为了简单起见,我在MVP模式中提取了该活动的功能:Android 如何从演示者访问活动上下文?,android,android-fragments,android-activity,kotlin,android-fragmentactivity,Android,Android Fragments,Android Activity,Kotlin,Android Fragmentactivity,我有一个带有计算的活动,为了简单起见,我在MVP模式中提取了该活动的功能: 钙质活性 CalcPresenter 早些时候,我把所有的计算都集中在一个活动中。在那次活动中,我做了一些计算: private fun Calculator.doCalculation() { this.complexCalcualtion(intArrayOf(1, 2, 3, 4, 5, 6), object : CalculationCallback { override fun onSu
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
}
}
})
}
整个doccalculation()
都是在另一个线程上完成的。我已将此方法移动到演示者,并希望将结果转发到视图:
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()
中为null,我在那里看不到view
此外,我无法访问那里的活动,因此我无法runOnUiThread
那里
如何将结果转发回视图/活动?您可以通过
LiveData
传递计算结果。此工具与活动生命周期集成,当活动(和it视图)处于活动状态时,您的数据将被交付
您可以这样实现计算器:
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()
}
}