programing

Android에서 RxJava를 사용할 시기 및 Android Architectural Components의 LiveData를 사용할 시기는?

bestprogram 2023. 10. 24. 21:30

Android에서 RxJava를 사용할 시기 및 Android Architectural Components의 LiveData를 사용할 시기는?

안드로이드에서 RxJava를 사용하고 Android Architectural Components에서 LiveData를 사용해야 할 이유가 없습니다.양쪽의 사용 사례와 차이점을 설명하는 코드 형식으로 샘플 예시와 함께 설명해주시면 정말 도움이 될 것 같습니다.

원래 질문에 대해서는 RxJava와 LiveData 둘 다 서로 정말 잘 보완합니다.

LiveDataAndroid 라이프사이클과 긴밀하게 통합된 ViewModel 계층에서 빛을 발합니다.ViewModel.RxJava@Bob Dalgleish에서 언급한 바와 같이 변환에 더 많은 기능을 제공합니다.

현재 저희가 사용하고 있는 것은RxJava데이터 소스 및 저장소 계층에 포함되며,LiveData 사용)LiveDataReactiveStreamsView Models(활동/파편에 데이터를 노출하기 전) - 이 접근 방식에 상당히 만족합니다.

Android LiveData는 원래 관찰자 패턴의 변형으로, 활성/비활성 전환이 추가되었습니다.이와 같이, 그것은 그 범위에 있어서 매우 제한적입니다.

Android LiveData(안드로이드 라이브데이터)에 설명된 예를 사용하여 위치 데이터를 모니터링하고 응용프로그램 상태에 따라 등록 및 등록 취소할 수 있는 클래스가 생성됩니다.

RxJava는 훨씬 더 일반화된 연산자를 제공합니다.이 관측 자료가 위치 데이터를 제공한다고 가정해 보겠습니다.

Observable<LocationData> locationObservable;

다음을 사용하여 관측 가능한 것의 구현을 구축할 수 있습니다.Observable.create()콜백 작업을 매핑할 수 있습니다.관찰자가 가입되면 콜백이 등록되고, 가입 해제되면 콜백이 등록 해제됩니다.구현은 예제에 제공된 코드와 매우 유사합니다.

또한 응용 프로그램이 활성 상태일 때 true를 나타내는 관측치가 있다고 가정합니다.

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.

LiveData와 RxJava 사이에는 많은 차이점이 있습니다.

  1. 라이브 데이터는 스트림이 아닌 반면 RxJava에서는 모든 것(말 그대로 모든 것)이 스트림입니다.
  2. LiveData는 관측 가능한 데이터 홀더 클래스입니다.일반적으로 관찰할 수 있는 것과 달리 LiveData는 라이프사이클을 인식하기 때문에 활동, 조각, 서비스와 같은 다른 앱 구성요소의 라이프사이클을 존중합니다.이러한 인식을 통해 LiveData는 활성 수명 주기 상태에 있는 앱 구성 요소 관찰자만 업데이트합니다.
  3. LiveData는 동기식이므로 RxJava와 같이 LiveData만으로 비동기적으로 코드 덩어리(네트워크 호출, 데이터베이스 조작 등)를 실행할 수 없습니다.
  4. 이 2인조를 최대한 활용하기 위해 최선의 방법은 비즈니스 로직(네트워크 호출, 데이터 조작 등)에 RxJava를 사용하고 프레젠테이션 계층에 LiveData를 사용하는 것입니다.이를 통해 비즈니스 로직에 대한 변환 및 스트림 기능과 UI에 대한 라이프사이클 인식 작업을 얻을 수 있습니다.
  5. LiveData와 RxJava를 함께 사용하면 서로 보완합니다.내 말은, RxJava로 모든 것을 하고 UI를 업데이트하고 싶을 때 마지막에, 아래에 주어진 코드와 같은 작업을 하여 Observable을 LiveData로 변경하라는 것입니다.따라서 뷰(UI)는 LiveData in ViewModel에서 LiveData를 관찰합니다. 여기서 LiveData는 가변형이 아닌 가변형 LiveData(또는 가변형 LiveData)에 불과합니다.
  6. 그렇다면 여기서 질문은, 왜 처음부터 LiveData를 사용해야 하느냐는 것입니다.아래 코드에서 볼 수 있듯이 RxJava에서 MutableLiveData(또는 LiveData)로의 응답을 저장하고 LiveData는 라이프사이클을 인식하므로 데이터가 라이프사이클을 인식하게 됩니다.이제 데이터 자체가 UI를 업데이트할 때와 그렇지 않은 때를 알 수 있는 가능성을 상상해 보십시오.
  7. LiveData에는 기록이 없습니다(현재 상태만 있음).따라서 채팅 어플리케이션에 라이브 데이터를 사용해서는 안 됩니다.
  8. RxJava와 함께 LiveData를 사용할 때 MediatorLiveData, SwitchMap 등이 필요 없습니다.스트림 제어 도구이며 RxJava가 여러 번 더 잘합니다.
  9. LiveData를 데이터 보유자로 간주하고 다른 것은 제외합니다.또한 LiveData는 라이프사이클을 인식하는 소비자라고 할 수 있습니다.

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

.LiveData에 대해 본질적으로 다른 도구는 아닙니다.RxJava, 그래서 왜 그것이 건축 구성요소로 도입되었습니까?RxJava관측 자료에 대한 모든 구독을 저장함으로써 라이프사이클을 쉽게 관리할 수 있었습니다.CompositeDispoable물건을 집어넣고 그 다음에 그것들을 처리합니다.onDestroy()Activity아니면onDestroyView()Fragment한 줄의 코드만 사용한다고요?

저는 이 질문에 RxJava를 이용하여 한번 영화 검색 앱을 만든 후 여기서 LiveData를 이용하여 충분히 답했습니다.

하지만 간단히 말해, 그럴 수도 있겠지만, 이는 기본적인 라이프사이클 지식을 갖추는 것 외에 관련 라이프사이클 방법을 우선적으로 고려해야 할 것입니다.그러나 Google I/O 2018의 Jetpack 세션 중 하나에 따르면 많은 개발자가 라이프사이클 관리가 복잡하다고 합니다.라이프사이클 의존성을 처리하지 않음으로써 발생하는 충돌 오류는 일부 개발자들이 라이프사이클을 잘 알고 있더라도 앱에서 사용하는 모든 액티비티/프래그먼트에서 이를 처리하는 것을 잊어버리는 또 다른 징후일 수 있습니다.대형 앱에서는 생산성에 부정적인 영향을 미칠 수 있음에도 불구하고 문제가 될 수 있습니다.

결론은 소개를 해서.LiveData, 더 많은 수의 개발자들이 라이프사이클 관리, 메모리 유출 및 크래시를 이해할 필요도 없이 MVVM을 채택할 것으로 예상됩니다.나는 그것을 의심하지 않지만,LiveData와 비교할 수 없습니다.RxJava능력과 개발자에게 주는 힘, 반응형 프로그래밍 및RxJava많은 사람들에게 이해하기 어려운 개념이자 도구입니다.그 반대로, 나는 생각하지 않습니다.LiveData의 대체품이 될 것입니다.RxJava이는 많은 개발자가 경험한 논란의 여지가 있는 광범위한 문제를 처리하기 위한 매우 간단한 도구일 뿐입니다.

** 업데이트 ** LiveData를 잘못 사용하면 예상치 못한 결과를 초래하는 방법을 설명하는 기사를 새로 추가했습니다.이러한 상황에서 RxJava가 구하러 올 수 있습니다.


반응형 생태계에서는 데이터를 방출하는 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한 관측 가능한Observable이 무언가를 "외친다"면 Observator는 Observable이 주어진 순간에 무언가를 외친다는 통지를 받습니다.

생각하기LiveData관리할 수 있는 Observatorable로 사용자가 관리할 수 있는 Observatorable.active주(state). 다른 말로 하면LiveData는 단순한 관찰 가능하지만 수명 주기도 담당합니다.

하지만 요청하신 두 가지 코드 케이스를 살펴보겠습니다.

A) 실시간 데이터

B) RX자바

A)는 LiveData의 기본 구현입니다.

1) 일반적으로 방향 변경을 유지하기 위해 ViewModel에서 LiveData를 인스턴스화합니다(읽기 전용인 LiveData 또는 쓰기 가능한 MutableLiveData가 있을 수 있으므로 일반적으로 LiveData 클래스 외부로 노출).

2) 에OnCreate기본 활동의 메서드(ViewModel이 아닌) Observer 개체를 "가입"합니다(일반적으로 on Changed 메서드).

3) 방법 관찰을 시작하여 링크를 설정합니다.

첫번째로ViewModel(비즈니스 논리 owns)

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) 당신은 관측 가능한 것을 선언합니다.

2) 당신은 옵저버를 선언합니다.

3) 관찰자와 함께 관찰자를 구독합니다.

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와 함께 사용됩니다.Lifecycle그리고 종종 와 함께ViewModel(앞서 살펴보았듯이) 아키텍처 구성 요소.사실 언제LiveDataViewModel과 결합하면 Observer에서 변경할 때마다 실시간으로 업데이트할 수 있으므로 필요한 곳에서 이벤트를 실시간으로 관리할 수 있습니다.사용방법LiveData라이프사이클의 개념과 상대적인 개체인 LifeCycleOwner/LifeCycle에 대해 알고 있는 것이 좋습니다. 또한 구현을 원한다면 Transformations를 살펴보시기를 권합니다.LiveData실제 시나리오에서는.여기서 당신은 위대한 커먼웨어에서 몇 가지 사용 사례를 찾아볼 수 있습니다.

기본적으로 정리하자면LiveData단순화된RXJava, 구성 요소 간에 소위 종속성 규칙이라고 불리는 명확한 규칙을 만들지 않고 여러 구성 요소 간의 변경 사항을 관찰하여 코드를 훨씬 쉽게 테스트하고 읽기 쉽게 만들 수 있는 우아한 방법입니다.RXJava는 LiveData 등의 작업을 수행할 수 있게 해줍니다.RXJava의 기능이 확장되었기 때문에 간단한 경우에 LiveData를 사용하거나 RXJava의 모든 기능을 활용할 수 있습니다. Android Architecture 구성 요소를 ViewModel로 계속 사용하는 것은 물론 다음을 의미합니다.RXJava스위치 맵과 실시간 데이터의 맵 대신 수백 개의 연산자가 있다고 생각하면 훨씬 복잡해질 수 있습니다.

RXJava 버전 2는 Object Oriented 패러다임을 혁신한 라이브러리로, 프로그램의 흐름을 관리하는 소위 기능적인 방법을 추가했습니다.

라이브 데이터는 안드로이드 팀이 개발한 안드로이드 아키텍처 구성 요소의 하위 집합입니다.

라이브 데이터 및 기타 아키텍처 구성 요소를 사용하면 메모리 유출 및 기타 유사한 문제를 아키텍처 구성 요소에서 처리할 수 있습니다.안드로이드 팀에서 개발한 제품이기 때문에 안드로이드용으로는 최고입니다.또한 안드로이드의 새로운 버전을 처리하는 업데이트도 제공합니다.

Android 앱 개발에만 사용하고 싶다면 Android 아키텍처 구성 요소를 사용해 보십시오.그렇지 않으면 웹 앱, 데스크톱 앱 등 다른 자바 앱을 사용하려면 RxJava를 사용합니다.

LiveData데이터 보유자로서 다른 것은 없습니다.또한 LiveData는 라이프사이클을 인식하는 소비자라고 할 수 있습니다.LiveData라이프사이클의 개념과 상대적인 객체인 LifeCycleOwner/LifeCycle에 대해 알고 비즈니스 로직에 대한 변환 및 스트림 기능을 얻고 UI에 대한 라이프사이클 인식 작업을 수행하는 것이 좋습니다.

Rx는 우아한 선언 스타일로 문제를 해결할 수 있는 강력한 도구입니다.비즈니스 측면 옵션 또는 Service Api 작업을 처리합니다.

  • LiveData가 부분적으로 Rx Subject 또는 SharedRxObservable과 동일함

  • LiveData는 구독 라이프사이클을 관리하지만 Rx Subject 구독은 수동으로 생성하고 폐기해야 합니다.

  • LiveData에 종료 상태가 없지만 Rx Subject에 OnError 및 OnCompleted가 있습니다.

라이브 데이터와 RxJava를 비교하는 것은 사과와 과일 샐러드를 비교하는 것입니다.

LiveData와 ContentOver를 비교하면 사과와 사과를 비교하는 것입니다.LiveData는 ContentObserver의 라이프사이클 인식 기능을 효과적으로 대체합니다.

RxJava를 AsyncTask 또는 다른 쓰레드 도구와 비교하는 것은 과일 샐러드를 오렌지와 비교하는 것입니다. RxJava는 단순히 쓰레드를 하는 것 이상의 것을 도와주기 때문입니다.

제 간단한 대답은 RxJava를 사용하지 않는 것입니다.그것은 지나치게 복잡하고 남용되고 있습니다.RxJava를 사용하는 모든 프로젝트의 경우 유지보수가 어렵고 디버그가 어렵습니다.RxJava는 요청을 발송하기 위해 스레드를 사용하여 비동기적으로 작업을 수행합니다. 일반적으로 이 작업은 전혀 필요하지 않으며, 필요한 경우 Kotlin coroutine이 99%의 시간 내에 더 나은 작업을 수행합니다.

언급URL : https://stackoverflow.com/questions/46312937/when-to-use-rxjava-in-android-and-when-to-use-livedata-from-android-architectura