Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从演示者访问活动上下文?_Android_Android Fragments_Android Activity_Kotlin_Android Fragmentactivity - Fatal编程技术网

Android 如何从演示者访问活动上下文?

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

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

  • 钙质活性
  • CalcPresenter
  • 早些时候,我把所有的计算都集中在一个活动中。在那次活动中,我做了一些计算:

    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()
        }
    }