android使用RxJava實現(xiàn)預加載
在上一篇文章中介紹了使用非RxJava環(huán)境下,使用Handler機制SyncBarrier的特性實現(xiàn)預加載功能的方法。
在RxJava的環(huán)境下使用BehaviorSubject的特性來實現(xiàn)也是很方便的。

BehaviorSubject內部會緩存消息流中最近的一個消息, 在后續(xù)有Subscriber訂閱時,會直接將緩存的消息發(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;
/**
* 預加載
* 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也是數(shù)據(jù)流中的一個
//如果直接observer.subscribeOn(Schedulers.io()).subscribe(subject);
//會導致subject只能緩存onCompleted
//所以此處新建一個OnSubscribe,通過調用subject.onNext(t)的方式來緩存數(shù)據(jù)
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實現(xiàn)的預加載方式
*/
public class RxPreLoaderActivity extends AppCompatActivity {
private TextView textView;
private RxPreLoader<String> preLoader;
@Override
protected void onCreate(Bundle savedInstanceState) {
preLoad();//啟動預加載
initLayout(savedInstanceState);
preLoader.get(observer);//展示預加載的數(shù)據(jù)
}
//初始化布局
private void initLayout(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("使用RxPreLoader");
//通過循環(huán)多次findById來模擬復雜頁面布局初始化的耗時
textView = (TextView)findViewById(R.id.textView);
}
//展示預加載的數(shù)據(jù)
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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android編程解析Json格式數(shù)據(jù)的方法
這篇文章主要介紹了Android編程解析Json格式數(shù)據(jù)的方法,涉及Android中json格式數(shù)據(jù)的構造、讀取及遍歷等技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
Android?PickerScrollView滑動選擇控件使用方法詳解
這篇文章主要為大家詳細介紹了Android?PickerScrollView滑動選擇控件,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-04-04

