91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

android使用RxJava實現預加載

發布時間:2020-08-27 23:18:53 來源:腳本之家 閱讀:179 作者:lucky_billy 欄目:移動開發

在上一篇文章中介紹了使用非RxJava環境下,使用Handler機制SyncBarrier的特性實現預加載功能的方法。

在RxJava的環境下使用BehaviorSubject的特性來實現也是很方便的。

android使用RxJava實現預加載

BehaviorSubject內部會緩存消息流中最近的一個消息, 在后續有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問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永寿县| 凯里市| 左云县| 天镇县| 凉山| 西林县| 修武县| 无极县| 威海市| 牟定县| 建宁县| 南江县| 台北市| 迁安市| 长治市| 佳木斯市| 岳阳县| 金堂县| 织金县| 广水市| 奉节县| 弋阳县| 平江县| 牡丹江市| 余姚市| 南投市| 景德镇市| 南京市| 禄丰县| 漯河市| 昌都县| 蓬莱市| 莎车县| 卢湾区| 和平县| 双柏县| 内丘县| 常州市| 利川市| 永福县| 古浪县|