안 탁 중 Rxjava
47177 단어 오리지널
*RxJava 의 GitHub 홈 페이지 에 있 는 자기 소 개 는'a library for composing asynchronous and event-based programs using observable sequences for the Java VM'(Java VM 에서 관측 가능 한 시퀀스 를 사용 하여 비동기 적 이 고 이벤트 기반 프로그램 을 구성 하 는 라 이브 러 리)이다.이것 이 바로 RxJava 입 니 다.아주 정확하게 요약 되 었 습 니 다.*
RxJava 장점
간결 한 비동기 작업 의 관건 적 인 점 은 프로그램의 간결 성 이다.스케줄 링 과정 이 비교적 복잡 한 상황 에서 비동기 코드 는 쓰기 도 어렵 고 읽 기도 어렵 기 때문이다.안 드 로 이 드 가 만 든 AsyncTask 와 Handler 는 사실 비동기 코드 를 더욱 간결 하 게 하기 위 한 것 이다.RxJava 의 장점 도 간결 하지만 간결 하고 남 다른 점 은 프로그램 논리 가 복잡 해 지면 서 간결 함 을 유지 할 수 있다 는 것 이다.
개념:확 장 된 관찰자 모델
RxJava 는 Observable(관찰 가능 자,즉 피 관찰자),Observer(관찰자),subscribe(구독),사건 등 네 가지 기본 개념 이 있다.Observable 과 Observer 는 subscribe()방법 을 통 해 구독 관 계 를 실현 하여 Observable 은 필요 할 때 이 벤트 를 보 내 Observer 에 알 릴 수 있 습 니 다
Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Hello");
subscriber.onNext("Hi");
subscriber.onNext("Aloha");
subscriber.onCompleted();
}
});
스 레 드 제어-Scheduler(1)스 레 드 가 지정 되 지 않 은 상황 에서 RxJava 는 스 레 드 가 변 하지 않 는 원칙 을 따른다.즉,어느 스 레 드 에서 subscribe()를 호출 하 는 지,어느 스 레 드 에서 이 벤트 를 생산 하 는 지.어느 라인 에서 생산 되 는 사건,어느 라인 에서 소비 되 는 사건.스 레 드 를 전환 하려 면 스케줄 러(스케줄 러)가 필요 합 니 다.
3)Subscribe(구독)는 Observable 과 Observer 를 만 든 후 subscribe()방법 으로 연결 하면 전체 체인 이 작 동 할 수 있 습 니 다.1.Subscriber.onStart()를 호출 합 니 다.이 방법 은 앞에서 이미 소개 되 었 으 니 선택 할 수 있 는 준비 방법 이다.2.Observable 의 OnSubscribe.call(Subscriber)을 호출 합 니 다.여기 서 이벤트 발송 의 논리 가 실행 되 기 시작 합 니 다.이 를 통 해 알 수 있 듯 이 RxJava 에서 Observable 은 생 성 할 때 바로 이 벤트 를 보 내 는 것 이 아니 라 구독 되 었 을 때,즉 subscribe()방법 이 실 행 될 때 이다.3.들 어 온 Subscriber 를 Subscription 으로 되 돌려 줍 니 다.이것 은 unsubscribe()를 편리 하 게 하기 위해 서 입 니 다.
1.Retrofit 와 의 결합
Retrofit 는 Square 의 유명한 네트워크 요청 라 이브 러 리 입 니 다.Retrofit 를 사용 하지 않 은 것 은 이 소절 을 뛰 어 넘 는 것 을 선택 할 수 있 습 니 다.제 가 든 모든 장면 은 예 일 뿐 입 니 다.그리고 예 간 에 앞 뒤 가 관련 되 지 않 고 벽돌 을 던 져 옥 을 끌 어 올 리 는 역할 일 뿐 입 니 다.그래서 여 기 를 뛰 어 넘 고 다른 장면 을 보 셔 도 됩 니 다.
Retrofit 는 전통 적 인 Callback 형식의 API 뿐만 아니 라 RxJava 버 전의 Observable 형식의 API 도 제공 합 니 다.다음은 Retrofit 의 RxJava 버 전 API 와 전통 버 전의 차 이 를 비교 적 으로 소개 하 겠 습 니 다.
2. RxBinding
RxBinding 은 Jake Wharton 의 오픈 소스 라 이브 러 리 로 Android 플랫폼 에 RxJava 기반 Binding API 를 제공 합 니 다.Binding 이란 OnClickListener 를 설정 하고 TextWatcher 와 같은 등록 바 인 딩 대상 을 설정 하 는 API 다.
3.각종 비동기 조작
앞에서 든 Retrofit 와 RxBinding 의 예 는 기 존의 Observable 라 이브 러 리 를 제공 할 수 있 는 두 개의 라 이브 러 리 입 니 다.이 라 이브 러 리 로 Observable 을 자동 으로 생 성 할 수 없 는 비동기 동작 이 있다 면 직접 쓸 수도 있 습 니 다.예 를 들 어 데이터 뱅 크 의 읽 기와 쓰기,큰 그림 의 불 러 오기,파일 압축/압축 해제 등 여러 가지 배경 에 놓 고 작업 해 야 하 는 시간 소모 작업 은 RxJava 로 이 루어 질 수 있 습 니 다.앞의 몇 장의 예 가 있 으 면 더 이상 예 를 들 지 않 아 도 될 것 입 니 다.
4. RxBus
RxBus 이름 은 라 이브 러 리 처럼 보이 지만 라 이브 러 리 가 아니 라 모델 입 니 다.RxJava 를 사용 하여 EventBus 를 실현 하 는 것 이 고 Otto 나 GreenRobot 의 EventBus 를 사용 하지 않 아 도 된다 는 생각 입 니 다.
public class Rxjava {
public static void main(String[] args) {
/* new Observable(){
@Override
protected void subscribeActual(Observer super String> observer) {
observer.onNext(" ");
observer.onNext(" ");
observer.onComplete();
}
}.subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
System.out.println(" :" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
System.out.println(" ");
}
});*/
// mapOpretor();
// flatMapOpretor();
// groupByOperator();
// filterOperator();
// distinctOperator();
// ignoreElements();
// elementAtOperator();
windowOperator();
}
//map
public static void mapOpretor(){
Observable.just("HELLO")
.map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
return s.toLowerCase();
}
})
.map(new Function<String, String>() {
@Override
public String apply(String s) throws Exception {
return s + ",world";
}
})
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String s) {
System.out.println(" :" + s);
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
//flatMap
public static void flatMapOpretor() {
User user = new User();
user.userName = "zhangsan";
user.addresss = new ArrayList<>();
User.Address address1 = new User.Address();
// User.Address address1 = new User.Address();
address1.street = " ";
address1.city = " ";
user.addresss.add(address1);
User.Address address2 = new User.Address();
address2.street = " ";
address2.city = " ";
user.addresss.add(address2);
/*Observable.just(user)
.map(new Function>() {
@Override
public List apply(User user) throws Exception {
return user.addresss;
}
}).subscribe(new Consumer>() {
@Override
public void accept(List addresses) throws Exception {
for (int i = 0; i < addresses.size(); i++) {
System.out.println(" :" + addresses.get(i).street);
}
}
});*/
Observable.just(user)
.flatMap(new Function<User, ObservableSource<User.Address>>() {
@Override
public ObservableSource<User.Address> apply(User user) throws Exception {
return Observable.fromIterable(user.addresss);
}
})
.subscribe(new Consumer<User.Address>() {
@Override
public void accept(User.Address address) throws Exception {
System.out.println(" :" + address.street);
}
});
}
//groupBy
public static void groupByOperator(){
Observable
.range(1,8)
.groupBy(new Function<Integer, String>() {
@Override
public String apply(Integer integer) throws Exception {
return (integer % 2 == 0)? " ":" ";
}
}).subscribe(new Consumer<GroupedObservable<String, Integer>>() {
@Override
public void accept(final GroupedObservable<String, Integer> stringIntegerGroupedObservable) throws Exception {
if(stringIntegerGroupedObservable.getKey().equals(" ")){
stringIntegerGroupedObservable.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(stringIntegerGroupedObservable.getKey() + "member:" + integer);
}
});
}/*else if(stringIntegerGroupedObservable.getKey().equals(" ")){
stringIntegerGroupedObservable.subscribe(new Consumer() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println(stringIntegerGroupedObservable.getKey() + "member:" + integer);
}
});
}*/
System.out.println();
}
});
}
//filter
public static void filterOperator(){
Observable.just(1,8,20,3,50,4,6,100)
.filter(new Predicate<Integer>() {
@Override
public boolean test(Integer integer) throws Exception {
return integer > 8;
}
}).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println("next :" + integer);
}
});
}
//distinct
public static void distinctOperator() {
Observable.just("A","A","B")
.distinct()
.subscribe(new Consumer<String>() {
@Override
public void accept(String integer) throws Exception {
System.out.println("next :" + integer);
}
});
}
//ignoreElements
public static void ignoreElements() {
Observable.just(1,2,3,4,5)
.ignoreElements()
.subscribe(new Action() {
@Override
public void run() throws Exception {
System.out.println(" ");
}
});
}
//elementAt n
public static void elementAtOperator() {
Observable.just(1,2,3,4,5,6,7)
.elementAt(2)
// .elementAt(12,34)
.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println("next:" + integer);
}
});
}
//window
public static void windowOperator() {
Observable.range(1,10)
.window(2)
.subscribe(new Consumer<Observable<Integer>>() {
@Override
public void accept(Observable<Integer> integerObservable) throws Exception {
System.out.println("On next:" );
integerObservable.subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
System.out.println("accept:" + integer );
}
});
}
});
}
}
String[] names = ...;
Observable.from(names)
.subscribe(new Action1<String>() {
@Override
public void call(String name) {
Log.d(tag, name);
}
});
id
int drawableRes = ...;
ImageView imageView = ...;
Observable.create(new OnSubscribe<Drawable>() {
@Override
public void call(Subscriber<? super Drawable> subscriber) {
Drawable drawable = getTheme().getDrawable(drawableRes));
subscriber.onNext(drawable);
subscriber.onCompleted();
}
}).subscribe(new Observer<Drawable>() {
@Override
public void onNext(Drawable drawable) {
imageView.setImageDrawable(drawable);
}
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Toast.makeText(activity, "Error!", Toast.LENGTH_SHORT).show();
}
});
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
mfc ClistCtrl 페이지에 데이터베이스 데이터 표시공정이 비교적 크기 때문에 일부 코드를 추출하다. 1. 다음은 조회 데이터베이스입니다. 2. ClistCtrl 페이지 나누기 표시: 자신의 필드 수에 따라 코드를 수정할 수 있다. #define PAGERECORD ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.