programing

MutableLiveData에서 setValue()와 postValue()의 차이

telebox 2023. 8. 10. 18:43
반응형

MutableLiveData에서 setValue()와 postValue()의 차이

변화의 가치를 만드는 두 가지 방법이 있습니다.MutableLiveData하지만 &의 차이점은 무엇입니까?MutableLiveData.

동일한 문서를 찾을 수 없습니다.

여기는 수업입니다.MutableLiveData안드로이드의

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);
    }
}

설명서를 기반으로 합니다.

setValue():

값을 설정합니다.활성 관찰자가 있는 경우 값이 해당 관찰자에게 전송됩니다.이 메서드는 주 스레드에서 호출해야 합니다.

postValue():

주 스레드에 작업을 게시하여 지정된 값을 설정합니다.메인 스레드가 게시된 작업을 실행하기 전에 이 메서드를 여러 번 호출한 경우 마지막 값만 발송됩니다.

요약하자면, 주요 차이점은 다음과 같습니다.

setValue()메서드는 주 스레드에서 호출되어야 합니다. 배경 , 하만백그운스값서한을설다면야해정에드레드라지,▁but면한다▁from▁a.postValue()사용해야 합니다.

위의 답변은 모두 정답입니다.하지만 한 가지 더 중요한 차이점이 있습니다. 당신이 면시하화에 전화를 한다면,postValue()그리고 그 후에 당신은 전화를 합니다.getValue()에서 설정한 값을 받지 못할 수 있습니다.postValue()메인 스레드가 이미 값을 설정했다면 게시한 값을 얻을 수 있지만 메인 스레드가 아직 값을 설정하지 않았다면 게시한 값을 얻을 수 없습니다.따라서 백그라운드 스레드에서 작업할 때는 주의해야 합니다.

setValue()스레드에서 으로 통지하고 합니다.LiveData즉시 값을 매기다려주세요.메인 스레드에서만 호출할 수 있습니다.
postValue().new Handler(Looper.mainLooper()).post(() -> setValue())그래서 그것은 달립니다.setValue경유로Handler메인스레드에 있습니다.모든 스레드에서 호출할 수 있습니다.

setValue()

값을 설정합니다.활성 관찰자가 있는 경우 값이 해당 관찰자에게 전송됩니다.

이 메서드는 주 스레드에서 호출해야 합니다.

postValue

백그라운드 스레드에서 값을 설정해야 하는 경우 다음을 사용할 수 있습니다.postValue(Object)

주 스레드에 작업을 게시하여 지정된 값을 설정합니다.

메인 스레드가 게시된 작업을 실행하기 전에 이 메서드를 여러 번 호출한 경우 마지막 값만 발송됩니다.

이것은 위의 문제에 대한 직접적인 대답이 아닙니다.Sagarw201의 답변은 훌륭합니다.그러나 View Models for MutableLiveData에서 사용하는 간단한 경험칙은 다음과 같습니다.

private boolean isMainThread() {
    return Looper.myLooper() == Looper.getMainLooper();
}

private MutableLiveData<Boolean> mutVal = new MutableLiveData<>(false);
public LiveData<Boolean> getMutVal() { return this.mutVal;  }
public void setMutVal(boolean val) {
    if (isMainThread()) mutVal.setValue(val);
    else mutVal.postValue(val);
}

를 바꿉니다.mutVal당신이 원하는 값으로.

setValue()메서드는 주 스레드에서 호출되어야 합니다.백그라운드 스레드에서 값을 설정해야 하는 경우 다음을 사용할 수 있습니다.postValue().

여기 더 있습니다.

사후 가치 - 어디서나 사용 가능

setValue - 주/부터만 설정합니다.UI 스레드

기본적으로 postValue는 백그라운드 스레드에서만 사용해야 합니다. setValue에 비해 속도가 느릴 수 있기 때문입니다. setValue는 더 빨리 반응합니다.

저는 두 사건 모두를 다루는 스니펫을 썼습니다.

/**
 * Live data thread-safe set-value
 * Context: https://stackoverflow.com/a/52227632/6688493
*/
fun <T> MutableLiveData<T>.assignValue(newValue: T){

    if(Looper.myLooper() == Looper.getMainLooper()) {
        this.value = newValue
    }
    else {
        this.postValue(newValue)
    }
}

TL; DR

  • 메인 스레드에서 작업하는 경우 setValue와 postValue 모두 동일한 방식으로 작동합니다. 즉, 값을 업데이트하고 관찰자에게 알립니다.
  • 일부 백그라운드 스레드에서 작업하는 경우 setValue를 사용할 수 없습니다.여기서는 관찰자와 함께 postValue를 사용해야 합니다.여기 더 보기

앱에서 활동/화면의 여러 보기에 대한 데이터를 포함하는 단일 LiveData를 사용했습니다.기본적으로 조회 수에 대한 데이터 집합 수에 해당하지 않습니다.이것은 postData가 설계된 방식 때문에 우리를 약간 괴롭혔습니다.LD에는 어떤 뷰를 업데이트해야 하는지를 보여주는 상태 객체가 있습니다.

LD는 다음과 같습니다.

LD {
   state (view_1, view_2, view_3 …),
   model_that_contains_data_of_all_views
}

하나의 이벤트가 발생할 때 업데이트해야 했던 몇 가지 보기(view_1 및 view_2)가 있습니다.이벤트가 발생할 때 동시에 알림을 받아야 함을 의미합니다.그래서 전화했어요

postData(LD(view_1, data))
postData(LD(view_2, data)

이것은 우리가 알고 있는 이유로 작동하지 않을 것입니다.

제가 이해한 것은 기본적으로 하나의 LD는 하나의 뷰만을 나타내야 한다는 것입니다.그러면 postData()를 연속으로 두 번 호출할 가능성이 없습니다.전화를 걸더라도 postData가 처리하는 방식은 최신 데이터를 보여주는 것과 같습니다.모든 것이 제자리에 잘 맞습니다.

LD 1개 -> 뷰 1개퍼펙트

하나의 LD -> 여러 뷰 이상한 동작이 있을 수 있습니다.

값을 설정하는 데 시간이 오래 걸릴 경우(예: 응답 속도가 느릴 수 있는 원격 소스에서 추가 데이터를 검색해야 하는 경우) postValue()를 사용하여 메인 스레드를 잠그지 않습니다.

값을 설정하는 것이 가장 일반적으로 빠른 것으로 보장되는 경우 setValue()가 가장 간단하고 가장 좋습니다.

언급URL : https://stackoverflow.com/questions/51299641/difference-of-setvalue-postvalue-in-mutablelivedata

반응형