RxJava2. x 초보 자
19616 단어 프레임
(1), RxJava 가 무엇 입 니까?
RxJava 는 ReactiveX 입 니 다.http://reactivex.io/) JVM 에서 의 구현, ReactiveX 는 Observable 시퀀스 를 사용 하여 비동기 와 이벤트 기반 프로그램 을 조합 합 니 다.RxJava 는 ReactiveX 의 연장 이 고 RxJava 는 경량급 이 며 RxJava 는 Observable 의 추상 적 이 고 이와 관련 된 고급 함수 에 만 관심 을 가진다.통속 적 으로 RxJava 는 프로 그래 밍 모델 로 일치 하 는 프로 그래 밍 인 터 페 이 스 를 제공 하여 비동기 데이터 흐름 을 처리 하 는 데 도움 을 준다.RxJava 는 함수 의 응답 방식 으로 구현 된다.
(2), RxJava 를 왜 사용 합 니까?
겉으로 볼 때 RxJava 는 코드 를 간결 하 게 작성 하고 간결 함 에 주의 하 는 것 이 간단 하지 않 습 니 다.코드 양 이 반드시 줄 어 들 수 있 는 것 은 아니 지만 구조 가 뚜렷 해서 읽 기 에 편리 하 다.사실 가장 근본 적 인 것 은 RxJava 가 데이터 흐름 이나 사건 을 유연 하 게 처리 하고 효율 적 인 처리 스 레 드 생 성과 병행 을 할 수 있다 는 것 이다.
둘째, RxJava 를 어떻게 사용 합 니까?
(1) AndroidStudio 를 사용 하려 면 gradle 에 추가 해 야 합 니 다.
//RxJava
compile 'io.reactivex.rxjava2:rxjava:2.0.1'
//RxAndroid
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
(2) 여 기 는 RxJava2. x 버 전 으로 어떻게 사용 하 는 지 소개 하고 독자 에 게 RxJava1. x 버 전 을 먼저 보 는 것 을 권장 합 니 다. 그러면 버 전의 차 이 를 비교 하여 RxJava 를 잘 이해 하 는 데 도움 이 됩 니 다.(3) 장면 을 사용 할 때 보통 안 드 로 이 드 개발 과정 에서 백 스테이지 스 레 드 에서 일부 임 무 를 처리 해 야 한다.예 를 들 어 AsyncTask, ContentProvider, Services, 네트워크 요청 등 이다.AsyncTask 를 사용 하면 메모리 가 새 고 ContentProvider 와 Services 설정 이 번 거 롭 습 니 다.RxJava 는 우리 가 이 문제 들 을 해결 하 는 데 도움 을 줄 수 있다.
3. RxJava 관찰자 모드
(1) 개념: 안 드 로 이 드 개발 에서 우리 가 자주 사용 하 는 클릭 사건 은 바로 관찰자 모델 이다.View 는 피 관찰자 이 고 OnClickListener 는 관찰자 이다. 이들 은 setOnClickListener 를 통 해 바 인 딩 관 계 를 구축한다. (여기 서 간단하게 소개 한다. Android 의 더 많은 개발 모델 을 알 고 싶다 면 책 인 을 추천 한다.)
(2), Observable (피 관찰자) / Flowable (피 관찰자 RxJava2. x 버 전 추가), Observer (관찰자) / Subscriber (관찰자), Subscribe (구독 자).관찰자 와 피 관찰자 가 구독 을 통 해 귀속 관 계 를 맺 는 다.
(3), RxJava2. X 에서 Observable 은 Observer 구독 에 사 용 됩 니 다. 백 프 레 셔 는 지원 되 지 않 으 며, Flowable 은 Subscriber 구독 에 사 용 됩 니 다. 백 프 레 셔 (Backpressure) 를 지원 합 니 다.배 압 이란 피 관찰자 가 데이터 나 사건 을 보 내 는 속도 가 관찰자 의 처리 속도 보다 훨씬 빠 른 상황 에서 상류 피 관찰자 에 게 발송 속 도 를 낮 추 라 고 알려 주 는 전략 을 말한다.배 압 에 대한 개념 추천http://blog.csdn.net/jdsjlzx/article/details/52717636
연산 자
(1), create () 는 Create 연산 자 를 사용 하여 처음부터 Observable / Flowable 을 만 듭 니 다. 이 연산 자 는 관찰 자 를 매개 변수 로 하 는 함 수 를 전달 합 니 다.
//
Observable observable = Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter e) throws Exception {
e.onNext("Hello Word");
e.onComplete();
}
});
//
Observer observer = new Observer() {
// RxJava2.x , , Disposable
@Override
public void onSubscribe(Disposable d) {
Log.e(TAG, "onSubscribe");
}
@Override
public void onNext(String s) {
Log.e(TAG, s);
}
@Override
public void onError(Throwable t) {
Log.e(TAG, "onError");
}
@Override
public void onComplete() {
Log.e(TAG, "onComplete");
}
};
//
observable.subscribe(observer);
이 코드 는 Observable 구현 방식 이 며, 인쇄 결 과 는 onSubscribe - > Hello Word - > onComplete 입 니 다.여기 서 알 수 있 듯 이 onSubscribe 는 onNext 전에 호출 됩 니 다. 여 기 는 onSubscribe 방법 에서 초기 화 된 작업 을 할 수 있 습 니 다.
Flowable flowable = Flowable.create(new FlowableOnSubscribe(){
@Override
public void subscribe(FlowableEmitter e) throws Exception {
e.onNext("Hello Word");
e.onComplete();
}
}, BackpressureStrategy.BUFFER);// ,
Subscriber subscriber = new Subscriber() {
@Override
public void onSubscribe(Subscription s) {
Log.e(TAG, "onSubscribe");
s.request(1);//request(n)
}
@Override
public void onNext(String s) {
Log.e(TAG, s);
}
@Override
public void onError(Throwable t) {
Log.e(TAG, "onError");
}
@Override
public void onComplete() {
Log.e(TAG, "onComplete");
}
};
flowable.subscribe(subscriber);
(2), just () 는 하나 이상 의 대상 을 이 대상 을 발사 하 는 Observable / Flowable 로 변환 합 니 다.
Observable.just("Hello World", "Very Good").subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.e(TAG, s);
}
});
Flowable.just("Hello World", "Very Good")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) {
Log.e(TAG, s);
}
});
여기 에는 관찰자 가 onNext () 사건 에 만 관심 을 가지 고 다른 사건 은 상관 하지 않 는 다 는 뜻 의 Consumer 가 있 습 니 다. 따라서 이렇게 쓸 수 있 습 니 다 (3). range () 는 지 정 된 범위 의 정수 서열 을 발사 하 는 Observable / Flowable 을 만 들 고 범위 의 시작 과 길 이 를 지정 할 수 있 습 니 다.두 개의 인 자 를 받 아들 이 고 하 나 는 범위 의 시작 값 이 며 하 나 는 범위 의 데이터 의 수량 입 니 다.
Observable.range(3, 4).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.e(TAG, integer + "");
}
});
// 3,4,5,6
Flowable.range(2,4).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.e(TAG, integer + "");
}
});
// 2,3,4,5
(4), flatMap () 은 데 이 터 를 발사 하 는 Observable 을 여러 개의 Observables 로 변환 한 후 발사 하 는 데 이 터 를 합 쳐 하나의 Observable 에 넣는다.flatMap () 을 어떻게 사용 하 는 지, 예 를 들 어 우 리 는 상품 분류, 주요 상품 (Goods) 과 하위 상품 (Category) 을 만들어 야 합 니 다.
new Thread(new Runnable() {
@Override
public void run() {
//
List list=// , , : , ,
for(// , : ){
Log.e(TAG," ");
for(// , : ){
// UI
runOnUiThread(new Runnable() {
@Override
public void run() {
Log.e(TAG," ");
}
});
}
}
}
}).start();
이 위조 코드 는 우리 가 자주 사용 하 는 쓰기 입 니 다. 하위 스 레 드 에서 데 이 터 를 얻 고 메 인 스 레 드 에서 UI 를 업데이트 합 니 다. 데이터 가 많 으 면 논리 적 으로 복잡 한 코드 의 가 독성 이 떨 어 집 니 다.flatMap () 을 어떻게 써 야 하 는 지 다시 봅 시다.
Flowable.fromIterable(goods).flatMap(new Function>() {
@Override
public Publisher apply(Goods goods) throws Exception {
return Flowable.fromIterable(goods.getList());
}
})
.subscribeOn(Schedulers.io())//
.observeOn(AndroidSchedulers.mainThread())//
.subscribe(new Consumer() {
@Override
public void accept(Category category) throws Exception {
Log.e(TAG, category.getName());
}
});
비교 해 보면 이런 방식 의 구조 가 매우 뚜렷 해 졌 다. flatpap () 와 같은 또 하나의 조작 부호 인 contactMap () 은 유일한 차이 점 은 flatpap () 이 무질서 하고 마지막 에 출력 한 것 과 원래 의 서열 이 반드시 같 지 않다 는 것 이다.contactMap () 은 질서 가 있 고 마지막 으로 출력 한 것 은 원래 의 순서 와 같 습 니 다.
연산 자 에 대해 서 는 여기까지 소개 하 겠 습 니 다. 다른 연산 자 를 알 고 싶다 면 들 어 갈 수 있 습 니 다.http://reactivex.io/살펴보다
5. 스 레 드 제어 (스케줄 러)
(1) 안 드 로 이 드 개발 에 도 가장 유용 한 곳 이다.우 리 는 항상 프로그램 에서 시간 이 걸 리 는 조작 을 해 야 한다. 예 를 들 어 네트워크 요청, 파일 조작, 데이터 베이스 작업 등 이다.보통 우 리 는 하위 스 레 드 에서 시간 을 소모 하 는 작업 을 하고 메 인 스 레 드 에서 ui 를 업데이트 합 니 다.(2) Scheduler 는 어떤 유용 한 방법 이 있 습 니까?
(3) Observable / Flowable 을 만 들 때 기본 값 은 메 인 스 레 드 에서 이 루어 집 니 다. 다음 코드 는:
Flowable.just("Hello World", "Very Good")
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) {
Log.e(TAG, Thread.currentThread().getName());
}
});
// main
위의 코드 와 같이 관찰자 든 피 관찰자 든 Scheduler 를 지정 하지 않 으 면 기본 스 레 드 입 니 다.개발 과정 에서 흔히 우 리 는 스 레 드 를 지정 해 야 하 는데 어떻게 바 꿉 니까?
Flowable<Integer> flowable = Flowable.create(new FlowableOnSubscribe<Integer>() {
@Override
public void subscribe(FlowableEmitter<Integer> e) throws Exception {
Log.e(TAG, "subscribe " + Thread.currentThread().getName());
e.onNext(1);
}
}, BackpressureStrategy.BUFFER);
Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.e(TAG, "accept " + Thread.currentThread().getName());
}
};
flowable.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(consumer);
// subscribe RxNewThreadScheduler-1
accept main
이 를 통 해 알 수 있 듯 이 피 관찰자 가 서브 스 레 드 에서 진행 되 고 관찰자 가 메 인 스 레 드 에서 진행 되 는 것 은 주로
subscribeOn(Schedulers.newThread())
observeOn(AndroidSchedulers.mainThread())
subscribeOn () 은 상류 피 관찰자 의 스 레 드 를 지정 하고 observeOn () 은 하류 관찰자 의 스 레 드 를 지정 합 니 다.
RxJava2. x 에 대해 간단하게 소개 합 니 다. 시간 이 있 으 면 프로젝트 를 만 들 고 시스템 은 이 프레임 워 크 를 사용 합 니 다.본 고 는 완전히 오리지널 이 아니 라 일부 문장 에 자신의 이 해 를 참고 하여 일부 내용 을 간소화 하고 소스 코드 와 관련 되 지 않 아 초보 자 에 게 쉽게 손 에 넣 을 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Pytest 테스트 프레임워크 기본 사용 방법 상세 정보pytest 소개 2. 매개 변수화를 지원하여 테스트할 테스트 용례를 세밀하게 제어할 수 있다. 3. 간단한 단원 테스트와 복잡한 기능 테스트를 지원할 수 있고selenium/appnium 등 자동화 테스트, 인터페...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.