안 드 로 이 드 는 RxJava 를 사용 하여 사전 로드 를 실현 합 니 다.
RxJava 환경 에서 Behavior Subject 의 특성 을 사용 해 구현 하 는 것 도 편리 하 다.
Behavior Subject 내부 에 서 는 메시지 흐름 중 가장 가 까 운 메 시 지 를 캐 시 합 니 다.나중에 Subscriber 구독 이 있 을 때 캐 시 메 시 지 를 Subscriber 에 직접 보 냅 니 다.
RxPreLoader.java 는 다음 과 같이 봉 인 됩 니 다.
import android.support.annotation.NonNull;
import java.util.LinkedList;
import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
import rx.subjects.BehaviorSubject;
/**
*
* preLoader = RxPreLoader.preLoad(observable);
* preLoader.get(observer1);
* preLoader.get(observer2);
* preLoader.reload();
* preLoader.destroy()
*
* @author billy.qi
*/
public class RxPreLoader<T> {
private BehaviorSubject<T> subject;
private Observable<T> observable;
private Subscription subscription;
private final LinkedList<Subscription> allObserver = new LinkedList<>();
private RxPreLoader(Observable<T> observable) {
// onCompleted
// observer.subscribeOn(Schedulers.io()).subscribe(subject);
// subject onCompleted
// OnSubscribe, subject.onNext(t)
this.observable = observable;
subject = BehaviorSubject.create();
subscription = Observable.create(new Observable.OnSubscribe<T>() {
@Override
public void call(Subscriber<? super T> subscriber) {
performLoad();
}
})
.subscribeOn(Schedulers.io())
.subscribe(subject);
}
public static <R> RxPreLoader<R> preLoad(@NonNull Observable<R> observable) {
return new RxPreLoader<R>(observable);
}
public void reload() {
performLoad();
}
public Subscription get(Observer<T> observer) {
Subscription subscription = subject.observeOn(AndroidSchedulers.mainThread())
.subscribe(observer);
allObserver.add(subscription);
return subscription;
}
private void performLoad() {
observable.subscribeOn(Schedulers.io())
.subscribe(new Action1<T>() {
@Override
public void call(T t) {
if (subject != null) {
subject.onNext(t);
}
}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});
}
public void destroy() {
synchronized (allObserver) {
while(!allObserver.isEmpty()) {
unsubscribe(allObserver.removeFirst());
}
}
unsubscribe(subscription);
subscription = null;
subject = null;
}
private void unsubscribe(Subscription subscription) {
if (subscription != null && !subscription.isUnsubscribed()) {
subscription.unsubscribe();
}
}
}
activity 에서 사용:
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;
import java.util.concurrent.TimeUnit;
import rx.Observable;
import rx.Subscriber;
/**
* RxJava
*/
public class RxPreLoaderActivity extends AppCompatActivity {
private TextView textView;
private RxPreLoader<String> preLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
preLoad();//
initLayout(savedInstanceState);
preLoader.get(observer);//
}
//
private void initLayout(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle(" RxPreLoader");
// findById
textView = (TextView)findViewById(R.id.textView);
}
//
Subscriber<String> observer = new Subscriber<String>() {
@Override public void onCompleted() { }
@Override public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onNext(String s) {
textView.setText(s);
}
};
private void preLoad() {
preLoader = RxPreLoader.preLoad(Observable.just("result").delay(500, TimeUnit.MILLISECONDS));
}
@Override
protected void onDestroy() {
super.onDestroy();
preLoader.destroy();//
}
}
마지막 으로 소스 코드 를 첨부 합 니 다http://xiazai.jb51.net/201701/yuanma/RxPreLoader(jb51.net).rar이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.