LiveData
一、关于setValue和postValue的问题
源码:
protected void postValue(T value) {
boolean postTask;
synchronized (mDataLock) {
postTask = mPendingData == NOT_SET;
mPendingData = value;
}
if (!postTask) {
return;
}
ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
}
源码:
private final Runnable mPostValueRunnable = new Runnable() {
@SuppressWarnings("unchecked")
@Override
public void run() {
Object newValue;
synchronized (mDataLock) {
newValue = mPendingData;
mPendingData = NOT_SET;
}
setValue((T) newValue);
}
};
-
setValue只能在主线程中使用,在子线程中必须用postValue
在
observe()中会对线程进行检测,只能是主线程。postValue()会将子线程中的事件通过Runnable发送到主线程中处理。 -
同一线程中,多次调用
postValue(),仅最后一次能收到;同一线程下,
mPendingData值取最后一次设置的,但是仅第一次的会进入到mPostValueRunnable,所以只会监听到最后一次的事件。 -
非同一线程使用
postValue(),收到的事件数不定,但是每个线程最多一次接收。只有
mPostValueRunnable执行之后,mPendingData才恢复NOT_SET的状态,此时再调用postValue才不会被return。
livedata监听不到,请考虑:
- 对象是否改变;
- setValue改成postValue
- 类型设置错误
473

被折叠的 条评论
为什么被折叠?



