Coroutines лучший способ использования

== сравнивает ссылки на объекты в Java и не является исключением для объектов String.

Для сравнения фактического содержимого объектов (в том числе String) необходимо использовать equals.

Если сравнение двух объектов String с использованием == оказывается true, это связано с тем, что объекты String были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String. Не следует ожидать сравнения одного объекта String, содержащего то же содержимое, что и другой объект String, используя == для оценки как true.

0
задан Sergey 10 March 2019 в 09:57
поделиться

1 ответ

С моей точки зрения, вы правильно используете сопрограмму. Несколько замечаний:

  • Вам не нужно передавать view: MyView в конструктор и присваивать его значение свойству в блоке init. Вместо этого вы можете пометить параметр view в конструкторе как val, и он станет свойством: функция

    class MyPresenter(private val view: MyView,
                      private val coroutineCtx: CoroutineContext = Dispatchers.Main) : CoroutineScope {
    
        // you can get rid of the next lines:
        private var view: MyView? = null
        init {
            this.view= view
        }
    
    }
    
  • launch возвращает значение Job. Вы можете добавить функцию расширения, например, launchSilent, чтобы вернуть Unit:

    fun CoroutineScope.launchSilent(
        context: CoroutineContext = EmptyCoroutineContext,
        start: CoroutineStart = CoroutineStart.DEFAULT,
        block: suspend CoroutineScope.() -> Unit
    ) {
         launch(context, start, block)
    }
    
  • Из моих наблюдений job.cancel() работает правильно: когда вы вызываете его, сопрограмма должна остановиться. Например, если мы поместим несколько журналов:

    fun updateData() = launch{
        Log.d("Tag", "launch start")
        val scanResult = repo.updateData()
        when(scanResult) {
            success -> { this.view.showSuccess()}
        }
        Log.d("Tag", "launch end")
    }
    

    и добавим некоторую задержку в функцию репо updateData():

    suspend fun updateData(): Result<Void> {
       delay(5000)
       val response = API.update().await()
       return response
    }
    

    И, например, во фрагменте после вызова presenter.updateData() ] мы называем что-то вроде Handler().postDelayed({ presenter.stopUpdate() }, 3000), мы не увидим «конец запуска» в журнале Logcat .

  • [Тысяча сто двадцать семь]
0
ответ дан Sergey 10 March 2019 в 09:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: