Как получить доступ к контексту активности от докладчика? - PullRequest
0 голосов
/ 21 марта 2019

У меня было действие с вычислением, и я для простоты извлек функциональность этого действия в шаблоне MVP:

  1. CalcActivity
  2. CalcPresenter

Раньше у меня были все расчеты в одном 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 там ..

Как я могу переслать свой результат обратно для просмотра / деятельности?

1 Ответ

1 голос
/ 21 марта 2019

Вы можете доставить результат расчета по 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()
    }
}
...