package com.shizhefei.test.models.datasource.rxjava_retrofit;
import android.util.Log;
import com.shizhefei.mvc.IAsyncDataSource;
import com.shizhefei.mvc.RequestHandle;
import com.shizhefei.mvc.ResponseSender;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.Subscriber;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.schedulers.Schedulers;
/**
* Created by LuckyJayce on 2016/7/21.
*/
public abstract class RxDataSource<DATA> implements IAsyncDataSource<DATA> {
@Override
public final RequestHandle refresh(final ResponseSender<DATA> sender) throws Exception {
DoneActionRegister<DATA> register = new DoneActionRegister<>();
return load(sender, refreshRX(register), register);
}
@Override
public final RequestHandle loadMore(ResponseSender<DATA> sender) throws Exception {
DoneActionRegister<DATA> register = new DoneActionRegister<>();
return load(sender, loadMoreRX(register), register);
}
private RequestHandle load(final ResponseSender<DATA> sender, final Observable<DATA> observable, final DoneActionRegister<DATA> register) {
final Subscriber<DATA> subscriber = new Subscriber<DATA>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(DATA data) {
for (Action1<DATA> subscriber : register.subscribers) {
subscriber.call(data);
}
Log.d("pppp", "sendData:");
sender.sendData(data);
}
};
observable.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(subscriber);
return new RequestHandle() {
@Override
public void cancle() {
Log.d("pppp", "cancle:");
if (!subscriber.isUnsubscribed()) {
subscriber.unsubscribe();
}
}
@Override
public boolean isRunning() {
return false;
}
};
}
public abstract Observable<DATA> refreshRX(DoneActionRegister<DATA> register) throws Exception;
public abstract Observable<DATA> loadMoreRX(DoneActionRegister<DATA> register) throws Exception;
public static class DoneActionRegister<DATA> {
private List<Action1<DATA>> subscribers = new ArrayList<>();
public void addAction(final Action1<DATA> doneAction) {
subscribers.add(doneAction);
}
}
}