Existem duas maneiras de alterar o valor de MutableLiveData
. Mas qual é a diferença entre setValue()
e postValue()
em MutableLiveData
.
Não consegui encontrar documentação para o mesmo.
Aqui está a aula MutableLiveData
de Android.
package android.arch.lifecycle;
/**
* {@link LiveData} which publicly exposes {@link #setValue(T)} and {@link #postValue(T)} method.
*
* @param <T> The type of data hold by this instance
*/
@SuppressWarnings("WeakerAccess")
public class MutableLiveData<T> extends LiveData<T> {
@Override
public void postValue(T value) {
super.postValue(value);
}
@Override
public void setValue(T value) {
super.setValue(value);
}
}
fonte
Todas as respostas acima estão corretas. Mas mais uma diferença importante. Se você chamar
postValue()
em um campo que não tem observadores e depois ligargetValue()
, você não receberá o valor que definiu empostValue()
. Portanto, tome cuidado se você trabalhar em threads de fundo sem observadores.fonte
setValue()
se possível, e usar 'postValue ()' com cautela, apenas quando necessário. ObrigadonoObserveLiveData.postValue("sample")
, em atividade, quando usei getValue comoviewModel.noObserveLiveData.getValue
Você quer dizer que não é o valor que defini em postValue () ("amostra")?setValue()
é chamado diretamente do thread do chamador, notifica os observadores de forma síncrona e altera oLiveData
valor imediatamente. Ele pode ser chamado apenas a partir de MainThread.postValue()
usa dentro de algo como issonew Handler(Looper.mainLooper()).post(() -> setValue())
, então ele é executadosetValue
atravésHandler
de MainThread. Ele pode ser chamado de qualquer thread.fonte
setValue()
postValue
fonte
Esta não é uma resposta direta ao problema acima. As respostas de Sagar e w201 são fantásticas. Mas uma regra prática simples que uso em ViewModels para MutableLiveData é:
Substitua
mutVal
pelo valor desejado.fonte
setValue()
método deve ser chamado a partir do thread principal. Se você precisar definir um valor de um thread de segundo plano, você pode usarpostValue()
.Mais aqui .
fonte
Em nosso aplicativo, usamos um LiveData único que contém dados para várias visualizações em uma atividade / tela. Basicamente, N não de conjuntos de dados para N de visualizações. Isso nos incomodou um pouco, devido à forma como o postData foi projetado. E temos objeto de estado em LD que transmite a visão sobre qual visão precisa ser atualizada.
então LD se parece com isto:
Existem algumas visualizações (view_1 e view_2) que tiveram que ser atualizadas quando um evento ocorre ... significa que elas devem ser notificadas ao mesmo tempo quando o evento ocorre. Então, liguei:
Isso não funcionaria por razões que conhecemos.
O que entendi é que basicamente um LD deve representar apenas uma visão. Então, não há chance de você ter que chamar postData () duas vezes seguidas. Mesmo se você chamar, a maneira como postData lida com isso para você é o que você também esperaria (mostrando os dados mais recentes para você na visualização). Tudo cai bem no lugar.
fonte