Когда использовать postvalue [дубликат]

Nov 01 2020

В следующем фрагменте кода:

    viewModelScope.launch {
  
        isLoading.postValue(true) 
            
        .....
   }

мы находимся в основном потоке, потому что viewModelScope.launchпо умолчанию выполняется в основном потоке, так же, какviewModelScope.launch(dispatchers.main)

В основном потоке имеет смысл использовать postValue? я имею в виду, не должно быть так:isLoading.value = true ?

Я нашел много этого фрагмента кода в Интернете, это правильно или неправильно?

Ответы

MerthanE Nov 02 2020 at 03:34

По документации:

На основании документации:

setValue ():

Устанавливает значение. Если есть активные наблюдатели, значение будет отправлено им. Этот метод необходимо вызывать из основного потока.

postValue ():

Отправляет задачу в основной поток, чтобы установить заданное значение. Если вы вызываете этот метод несколько раз до того, как основной поток выполнит опубликованную задачу, будет отправлено только последнее значение.

Поэтому я бы всегда использовал setValue, когда это возможно, в вашем случае, как вы заметили, лучше setValue, потому что вы можете быть уверены, что он всегда будет в основном потоке.

Однако postValue также можно вызвать из основного потока, но он будет работать немного хуже.

ZakariaHajja Nov 01 2020 at 19:10

Обычно есть два способа установить значение объекта liveData:

  • setValue ==> основной поток
  • postValue ==> другие темы