如何从演示者访问 activity 上下文?
How to access activity context from presenter?
我有一个带有计算的 Activity,为了简单起见,我在 MVP 模式中提取了那个 Activity 的功能:
- 计算Activity
- 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()
}
}
我有一个带有计算的 Activity,为了简单起见,我在 MVP 模式中提取了那个 Activity 的功能:
- 计算Activity
- 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()
}
}