真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android使用RxJava實(shí)現(xiàn)預(yù)加載

在上一篇文章中介紹了使用非RxJava環(huán)境下,使用Handler機(jī)制SyncBarrier的特性實(shí)現(xiàn)預(yù)加載功能的方法。

在嵐山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作按需策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,成都營(yíng)銷網(wǎng)站建設(shè),外貿(mào)營(yíng)銷網(wǎng)站建設(shè),嵐山網(wǎng)站建設(shè)費(fèi)用合理。

在RxJava的環(huán)境下使用BehaviorSubject的特性來(lái)實(shí)現(xiàn)也是很方便的。

android使用RxJava實(shí)現(xiàn)預(yù)加載

BehaviorSubject內(nèi)部會(huì)緩存消息流中最近的一個(gè)消息, 在后續(xù)有Subscriber訂閱時(shí),會(huì)直接將緩存的消息發(fā)送給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;

/**
 * 預(yù)加載
 * preLoader = RxPreLoader.preLoad(observable);
 * preLoader.get(observer1);
 * preLoader.get(observer2);
 * preLoader.reload();
 * preLoader.destroy()
 *
 * @author billy.qi
 */
public class RxPreLoader {
 private BehaviorSubject subject;
 private Observable observable;
 private Subscription subscription;
 private final LinkedList allObserver = new LinkedList<>();


 private RxPreLoader(Observable observable) {
 //注意的是由于onCompleted也是數(shù)據(jù)流中的一個(gè)
 //如果直接observer.subscribeOn(Schedulers.io()).subscribe(subject);
 //會(huì)導(dǎo)致subject只能緩存onCompleted
 //所以此處新建一個(gè)OnSubscribe,通過(guò)調(diào)用subject.onNext(t)的方式來(lái)緩存數(shù)據(jù)
 this.observable = observable;
 subject = BehaviorSubject.create();
 subscription = Observable.create(new Observable.OnSubscribe() {
  @Override
  public void call(Subscriber<? super T> subscriber) {
  performLoad();
  }
 })
 .subscribeOn(Schedulers.io())
 .subscribe(subject);
 }

 public static  RxPreLoader preLoad(@NonNull Observable observable) {
 return new RxPreLoader(observable);
 }

 public void reload() {
 performLoad();
 }

 public Subscription get(Observer observer) {
 Subscription subscription = subject.observeOn(AndroidSchedulers.mainThread())
  .subscribe(observer);
 allObserver.add(subscription);
 return subscription;
 }


 private void performLoad() {
 observable.subscribeOn(Schedulers.io())
  .subscribe(new Action1() {
   @Override
   public void call(T t) {
   if (subject != null) {
    subject.onNext(t);
   }
   }
  }, new Action1() {
   @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實(shí)現(xiàn)的預(yù)加載方式
 */
public class RxPreLoaderActivity extends AppCompatActivity {

 private TextView textView;
 private RxPreLoader preLoader;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 preLoad();//啟動(dòng)預(yù)加載
 initLayout(savedInstanceState);
 preLoader.get(observer);//展示預(yù)加載的數(shù)據(jù)
 }

 //初始化布局
 private void initLayout(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 setTitle("使用RxPreLoader");
 //通過(guò)循環(huán)多次findById來(lái)模擬復(fù)雜頁(yè)面布局初始化的耗時(shí)
 textView = (TextView)findViewById(R.id.textView);
 }

 //展示預(yù)加載的數(shù)據(jù)
 Subscriber observer = new Subscriber() {
 @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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


新聞標(biāo)題:android使用RxJava實(shí)現(xiàn)預(yù)加載
網(wǎng)址分享:http://weahome.cn/article/geohco.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部