package com.pandaq.pandaeye.modules.zhihu.home.mvp; import com.pandaq.pandaeye.CustomApplication; import com.pandaq.pandaeye.api.ApiManager; import com.pandaq.pandaeye.config.Constants; import com.pandaq.pandaeye.disklrucache.DiskCacheManager; import com.pandaq.pandaeye.BasePresenter; import com.pandaq.pandaqlib.magicrecyclerView.BaseItem; import com.pandaq.pandaqlib.magicrecyclerView.BaseRecyclerAdapter; import java.util.ArrayList; import java.util.List; import io.reactivex.Observable; import io.reactivex.ObservableEmitter; import io.reactivex.ObservableOnSubscribe; import io.reactivex.Observer; import io.reactivex.SingleObserver; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Function; import io.reactivex.schedulers.Schedulers; /** * Created by PandaQ on 2016/9/13. * email : 767807368@qq.com */ public class ZhiHuPresenter extends BasePresenter implements ZhiHuHomeContract.Presenter { private ZhiHuHomeContract.View mZhiHuDailyFrag; private String date; public ZhiHuPresenter(ZhiHuHomeContract.View zhiHuDailyFrag) { this.mZhiHuDailyFrag = zhiHuDailyFrag; } public void refreshZhihuDaily() { mZhiHuDailyFrag.showRefreshBar(); ApiManager.getInstence() .getZhihuService() .getLatestZhihuDaily() .map(new Function<ZhiHuDaily, ZhiHuDaily>() { //io 线程存储缓存 @Override public ZhiHuDaily apply(ZhiHuDaily zhiHuDaily) { DiskCacheManager manager = new DiskCacheManager(CustomApplication.getContext(), Constants.CACHE_ZHIHU_FILE); manager.put(Constants.CACHE_ZHIHU_DAILY, zhiHuDaily); return zhiHuDaily; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<ZhiHuDaily>() { @Override public void onComplete() { mZhiHuDailyFrag.hideRefreshBar(); } @Override public void onError(Throwable e) { mZhiHuDailyFrag.hideRefreshBar(); mZhiHuDailyFrag.refreshFail(e.getMessage()); } @Override public void onSubscribe(Disposable d) { addDisposable(d); } @Override public void onNext(ZhiHuDaily zhiHuDaily) { date = zhiHuDaily.getDate(); mZhiHuDailyFrag.hideRefreshBar(); mZhiHuDailyFrag.refreshSuccessed(zhiHuDaily); } }); } public void loadMoreData() { ApiManager.getInstence() .getZhihuService() .getZhihuDaily(date) .map(new Function<ZhiHuDaily, ArrayList<ZhiHuStory>>() { @Override public ArrayList<ZhiHuStory> apply(ZhiHuDaily zhiHuDaily) { date = zhiHuDaily.getDate(); return zhiHuDaily.getStories(); } }) .flatMap(new Function<ArrayList<ZhiHuStory>, Observable<ZhiHuStory>>() { @Override public Observable<ZhiHuStory> apply(ArrayList<ZhiHuStory> zhiHuStories) { return Observable.fromIterable(zhiHuStories); } }) .map(new Function<ZhiHuStory, BaseItem>() { @Override public BaseItem apply(ZhiHuStory zhiHuStory) { //将日期值设置到 story 中 zhiHuStory.setDate(date); BaseItem<ZhiHuStory> baseItem = new BaseItem<>(); baseItem.setData(zhiHuStory); return baseItem; } }) .toList() // 在所有的数据 list 前面加上当天的 tag .map(new Function<List<BaseItem>, List<BaseItem>>() { @Override public List<BaseItem> apply(List<BaseItem> baseItems) { BaseItem<String> baseItem = new BaseItem<>(); baseItem.setItemType(BaseRecyclerAdapter.RecyclerItemType.TYPE_TAGS); baseItem.setData(date); baseItems.add(0, baseItem); return baseItems; } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new SingleObserver<List<BaseItem>>() { @Override public void onSubscribe(Disposable d) { addDisposable(d); } @Override public void onSuccess(List<BaseItem> value) { mZhiHuDailyFrag.loadSuccessed((ArrayList<BaseItem>) value); } @Override public void onError(Throwable e) { mZhiHuDailyFrag.loadFail(e.getMessage()); } }); } /** * 加载缓存 */ public void loadCache() { final DiskCacheManager manager = new DiskCacheManager(CustomApplication.getContext(), Constants.CACHE_ZHIHU_FILE); Observable.create(new ObservableOnSubscribe<ZhiHuDaily>() { @Override public void subscribe(ObservableEmitter<ZhiHuDaily> e) throws Exception { ZhiHuDaily zhiHuDaily = manager.getSerializable(Constants.CACHE_ZHIHU_DAILY); e.onNext(zhiHuDaily); } }).subscribe(new Observer<ZhiHuDaily>() { @Override public void onSubscribe(Disposable d) { addDisposable(d); } @Override public void onNext(ZhiHuDaily zhiHuDaily) { if (zhiHuDaily != null) { date = zhiHuDaily.getDate(); mZhiHuDailyFrag.refreshSuccessed(zhiHuDaily); } } @Override public void onError(Throwable e) { } @Override public void onComplete() { } }); } }