답변:
Android LiveData는 활성 / 비활성 전환이 추가 된 원래 옵저버 패턴의 변형입니다. 따라서 범위가 매우 제한적입니다.
Android LiveData에 설명 된 예제를 사용하여 위치 데이터를 모니터링하고 애플리케이션 상태에 따라 등록 및 등록 취소하기위한 클래스가 작성됩니다.
RxJava는 훨씬 일반화 된 연산자를 제공합니다. 이 관측 가능 위치 데이터를 제공한다고 가정 해 봅시다.
Observable<LocationData> locationObservable;
Observable.create()
콜백 작업을 매핑 하기 위해 옵저버 블의 구현을 구축 할 수 있습니다 . 옵저버 블이 구독되면 콜백이 등록되고 구독이 취소되면 콜백이 등록 취소됩니다. 구현은 예제에 제공된 코드와 매우 유사합니다.
또한 응용 프로그램이 활성화 될 때 true를 방출하는 Observable이 있다고 가정합니다.
Observable<Boolean> isActive;
그런 다음 다음을 통해 LiveData의 모든 기능을 제공 할 수 있습니다.
Observable<LocationData> liveLocation =
isActive
.switchMap( active -> active ? locationObservable : Observable.never() );
switchMap()
응용 프로그램이 활성화되어 있지 않으면 운영자 역시 현재의 스트림으로 위치하거나 아무것도 제공한다. 당신은 일단 liveLocation
관찰을, 거기에 당신이 RxJava 연산자를 사용하여 함께 할 수있는 많은 것들을. 내가 가장 좋아하는 예는 다음과 같습니다.
liveLocation.distinctUntilChanged()
.filter( location -> isLocationInAreaOfInterest( location ) )
.subscribe( location -> doSomethingWithNewLocation( location ) );
위치가 변경된 경우에만 작업을 수행하며 위치가 흥미 롭습니다. 시간 연산자를 결합하여 속도를 결정하는 유사한 작업을 만들 수 있습니다. 더 중요한 것은 RxJava 연산자를 사용하여 기본 스레드에서 작업이 발생하는지 또는 백그라운드 스레드에서 발생하는지 또는 다중 스레드에서 발생하는지에 대한 세부 제어를 제공 할 수 있습니다.
RxJava의 핵심은 라이브러리에서 제공되는 작업 또는 사용자가 제공 한 사용자 지정 작업을 사용하여 제어 및 타이밍을 단일 유니버스로 결합한다는 것입니다.
LiveData는 해당 유니버스의 하나의 작은 부분 만 처리합니다 liveLocation
.
The point of RxJava is that it combines control and timing into a single universe, using operations provided from the library, or even custom operations that you provide.
그러나 LiveData 수명주기를 인식하지 못합니다. Rx를 사용한다면 수명주기 변경을 처리 할 필요가 없습니까?
원래 질문과 관련하여 RxJava와 LiveData는 서로를 잘 보완합니다.
LiveData
Android 라이프 사이클 및과의 긴밀한 통합으로 ViewModel 레이어에서 빛을 발합니다 ViewModel
. RxJava
@Bob Dalgleish에서 언급 한대로 더 많은 변환 기능을 제공합니다.
현재 우리는 RxJava
데이터 소스 및 리포지토리 계층에서 사용하고 있으며 ViewModels에서 데이터를 활동 / 조각에 노출하기 전에 으로 변환 LiveData
하여 사용 LiveDataReactiveStreams
합니다.이 접근법에 매우 만족합니다.
observeOn
, LiveDataReactiveStreams
호출하여 어쨌든 않습니다 LiveData.postValue()
. 그리고 당신 subscribeOn
이 일반적으로 어떤 영향을 미칠 것이라는 보장 은 없습니다 .
LiveData와 RxJava에는 많은 차이점이 있습니다.
public class RegistrationViewModel extends ViewModel {
Disposable disposable;
private RegistrationRepo registrationRepo;
private MutableLiveData<RegistrationResponse> modelMutableLiveData =
new MutableLiveData<>();
public RegistrationViewModel() {
}
public RegistrationViewModel(RegistrationRepo registrationRepo) {
this.registrationRepo = registrationRepo;
}
public void init(RegistrationModel registrationModel) {
disposable = registrationRepo.loginForUser(registrationModel)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<Response<RegistrationResponse>>() {
@Override
public void accept(Response<RegistrationResponse>
registrationModelResponse) throws Exception {
modelMutableLiveData.setValue(registrationModelResponse.body());
}
});
}
public LiveData<RegistrationResponse> getModelLiveData() {
return modelMutableLiveData;
}
@Override
protected void onCleared() {
super.onCleared();
disposable.dispose();
}
}
onCleared
. 를 지우는 것이 좋습니다 .
사실, LiveData
에 본질적으로 다른 도구가 아닙니다 RxJava
그래서 왜 아키텍처 구성 요소로 도입, RxJava
쉽게 수명주기를 관리해야 할 수있는에서 관찰 가능한 모든 구독을 저장하여 CompositeDispoable
그들을 처분 한 후 객체와 onDestroy()
의 Activity
또는 onDestroyView()
의 Fragment
하나를 사용하여 코드 줄?
나는 완전히 RxJava를 사용하여 다음 LiveData를 사용하여 한 번 영화 검색 앱 구축이 질문에 대답 한 여기를 .
그러나 간단히 말해서 그렇습니다.하지만 기본 수명주기 지식을 갖는 것 외에도 관련 수명주기 방법을 우선해야합니다. 이것은 여전히 일부 사람들에게는 의미가 없지만 Google I / O 2018 의 Jetpack 세션 중 하나에 따르면 많은 개발자가 라이프 사이클 관리가 복잡하다는 것을 알았습니다 . 수명주기 종속성을 처리하지 않아 발생하는 충돌 오류는 일부 개발자가 수명주기에 대해 잘 알고 있더라도 앱에서 사용하는 모든 활동 / 조각에서이를 관리하는 것을 잊었 음을 나타내는 또 다른 신호일 수 있습니다. 큰 앱에서는 생산성에 미칠 수있는 부정적인 영향에도 불구하고 문제가 될 수 있습니다.
결론 LiveData
은 수명주기 관리, 메모리 누수 및 충돌을 이해하지 않고도 더 많은 수의 개발자가 MVVM을 채택 할 것으로 예상된다는 것입니다. 비록 의심 할 여지없이 기능과 개발자에게 제공하는 기능, 반응 형 프로그래밍과 LiveData
비교할 수 없으며 많은 사람들에게 이해하기 어려운 개념과 도구입니다. 다른 한편으로, 나는 많은 개발자들이 겪고있는 논란의 여지가있는 광범위한 문제를 처리하기위한 매우 간단한 도구를 대신 할 수 있다고 생각하지는 않는다 .RxJava
RxJava
LiveData
RxJava
** 업데이트 ** LiveData를 잘못 사용하여 예기치 않은 결과를 초래할 수있는 방법을 설명하는 새 기사를 여기에 추가했습니다 . 이러한 상황에서 RxJava가 구조 될 수 있습니다.
LiveData
폐기 할 것입니다.onStop
반응 생태계에서 알 수 있듯이 우리는 데이터를 방출 하는 Observable 과이 Observable 방출을 구독 (알림) 하는 Observer 를 가지고 있으며 , 소위 Observer 패턴이 어떻게 작동하는지 이상한 것은 없습니다. 관찰 가능한 "소리", 관찰자는 주어진 순간에 Observable이 무언가를 외쳤다는 알림을받습니다.
상태 LiveData
에있는 옵저버를 관리 할 수있는 옵저버 블이라고 생각하십시오 active
. 다른 말로 LiveData
하면 간단한 Observable 이지만 수명 주기도 관리합니다.
그러나 요청한 두 가지 코드 사례를 보자.
A) 라이브 데이터
B) RXJava
A) LiveData의 기본 구현입니다
1) 일반적으로 방향 변경을 유지하기 위해 ViewModel에서 LiveData를 인스턴스화합니다 (읽기 전용 인 LiveData 또는 쓰기 가능한 MutableLiveData를 가질 수 있으므로 일반적으로 클래스 LiveData 외부에 노출)
2)에서 OnCreate
의 방법은 홈페이지 활동 (안 뷰 모델)을 관찰자 객체를 ( "가입"일반적으로는 A는 onChanged 방법)
3) 메소드를 시작하여 링크를 설정하십시오.
먼저 ViewModel
(비즈니스 로직을 소유 함)
class ViewModel : ViewModel() { //Point 1
var liveData: MutableLiveData<Int> = MutableLiveData()
}
그리고 이것은 MainActivity
(가능한 한 바보)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val ViewModelProvider= ViewModelProviders.of(this).get(ViewModel::class.java)
ViewModelProvider.observe(this, Observer {//Points 2 and 3
//what you want to observe
})
}
}
}
B) 이것이 RXJava의 기본 구현입니다.
1) 당신은 Observable을 선언합니다
2) 당신은 관찰자를 선언
3) Observable을 Observer와 구독
Observable.just(1, 2, 3, 4, 5, 6) // Point 1
.subscribe(new Subscriber() { //Points 2 & 3
@Override
public void onCompleted() {
System.out.println("Complete!");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(Double value) {
System.out.println("onNext: " + value);
}
});
특히 아키텍처 구성 요소 와 함께 LiveData
사용됩니다 . 실제로 ViewModel과 결합 하면 Observer의 모든 변경 사항을 실시간으로 업데이트 하여 이벤트가 필요한 곳에서 실시간으로 관리 할 수 있습니다. 사용이에 강하게의 개념을 알고하는 것이 좋습니다 라이프 사이클을 상대 개체를 LifeCycleOwner / 라이프 사이클을 , 또한 당신이 한 번 봐 가지고 제안 변환을 구현하려는 경우, 실제 시나리오에서. 여기서 당신은 훌륭한 commonsware 에서 사용 사례를 찾을 수 있습니다 .Lifecycle
ViewModel
LiveData
LiveData
LiveData
기본적으로 마무리하는 것은 구성 요소 사이에 명확한 소위 종속성 규칙을 만들지 않고 여러 구성 요소의 변경 사항을 관찰LiveData
하는 간단한RXJava
방법으로 코드를 훨씬 쉽게 테스트하고 더 읽기 쉽게 만들 수 있습니다. RXJava를 사용하면 LiveData 등을 수행 할 수 있습니다. RXJava의 확장 기능으로 인해 간단한 사례에 LiveData를 사용하거나 Android Architecture 구성 요소를 ViewModel 로 사용하여 RXJava의 모든 기능을 계속 활용할RXJava
수 있습니다.물론훨씬 복잡 할 수 있습니다. SwitchMap 및 LiveData의 맵 (현재).
RXJava 버전 2는 객체 지향 패러다임을 혁명적으로 만든 라이브러리로, 프로그램 흐름을 관리하는 기능적 방법을 추가했습니다.
LiveData는 Android 팀에서 개발 한 Android 아키텍처 구성 요소의 하위 집합입니다.
라이브 데이터 및 기타 아키텍처 구성 요소를 사용하면 메모리 누수 및 기타 유사한 문제가 아키텍처 구성 요소에 의해 처리됩니다. 그것은 안드로이드 팀에 의해 개발되었으므로 안드로이드에 가장 적합합니다. 또한 새로운 버전의 Android를 처리하는 업데이트도 제공합니다.
Android 앱 개발에만 사용하려면 Android 아키텍처 구성 요소로 이동하십시오. 그렇지 않으면 웹 앱, 데스크탑 앱 등과 같은 다른 Java 앱을 사용하려면 RxJava를 사용하십시오.