안 드 로 이 드 는 RxJava 를 사용 하여 사전 로드 를 실현 합 니 다.

이전 글에 서 는 비 RxJava 환경 에서 Handler 메커니즘 SyncBarrier 의 특성 을 사용 하여 사전 로드 기능 을 수행 하 는 방법 을 소개 했다.
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
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기