package com.codeest.geeknews.presenter.vtex; import com.codeest.geeknews.base.RxPresenter; import com.codeest.geeknews.model.bean.TopicListBean; import com.codeest.geeknews.model.http.api.VtexApis; import com.codeest.geeknews.base.contract.vtex.VtexContract; import com.codeest.geeknews.util.LogUtil; import com.codeest.geeknews.widget.CommonSubscriber; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import io.reactivex.Flowable; import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.annotations.NonNull; import io.reactivex.functions.Function; import io.reactivex.functions.Predicate; import io.reactivex.schedulers.Schedulers; /** * Created by codeest on 16/12/23. */ public class VtexPresenter extends RxPresenter<VtexContract.View> implements VtexContract.Presenter{ @Inject public VtexPresenter() { } @Override public void getContent(String type) { addSubscribe(Flowable .just(VtexApis.TAB_HOST + type) .subscribeOn(Schedulers.io()) .map(new Function<String, Document>() { @Override public Document apply(String s) { try { return Jsoup.connect(s).timeout(10000).get(); } catch (IOException e) { LogUtil.d(e.toString()); e.printStackTrace(); } return null; } }) .filter(new Predicate<Document>() { @Override public boolean test(@NonNull Document document) throws Exception { return document != null; } }) .map(new Function<Document, List<TopicListBean>>() { @Override public List<TopicListBean> apply(Document doc) { List<TopicListBean> mList = new ArrayList<>(); Elements itemElements = doc.select("div.cell.item"); //item根节点 int count = itemElements.size(); for (int i = 0; i < count; i++) { Elements titleElements = itemElements.get(i).select("div.cell.item table tr td span.item_title > a"); //标题 Elements imgElements = itemElements.get(i).select("div.cell.item table tr td img.avatar"); //头像 Elements nodeElements = itemElements.get(i).select("div.cell.item table tr span.small.fade a.node"); //节点 Elements commentElements = itemElements.get(i).select("div.cell.item table tr a.count_livid"); //评论数 Elements nameElements = itemElements.get(i).select("div.cell.item table tr span.small.fade strong a"); //作者 & 最后回复 Elements timeElements = itemElements.get(i).select("div.cell.item table tr span.small.fade"); //更新时间 TopicListBean bean = new TopicListBean(); if (titleElements.size() > 0) { bean.setTitle(titleElements.get(0).text()); bean.setTopicId(parseId(titleElements.get(0).attr("href"))); } if (imgElements.size() > 0) { bean.setImgUrl(parseImg(imgElements.get(0).attr("src"))); } if (nodeElements.size() > 0) { bean.setNode(nodeElements.get(0).text()); } if (nameElements.size() > 0) { bean.setName(nameElements.get(0).text()); } //存在没有 最后回复者、评论数、更新时间的情况 if (nameElements.size() > 1) { bean.setLastUser(nameElements.get(1).text()); } if (commentElements.size() > 0) { bean.setCommentNum(Integer.valueOf(commentElements.get(0).text())); } if (timeElements.size() > 1) { bean.setUpdateTime(parseTime(timeElements.get(1).text())); } mList.add(bean); } return mList; } }) .observeOn(AndroidSchedulers.mainThread()) .subscribeWith(new CommonSubscriber<List<TopicListBean>>(mView) { @Override public void onNext(List<TopicListBean> mList) { mView.showContent(mList); } }) ); } private String parseId(String str) { int idEnd = str.indexOf("#"); return str.substring(3, idEnd); } private String parseTime(String str) { int timeEnd = str.indexOf("  •"); if (timeEnd == -1) { return str; } return str.substring(0, timeEnd); } public static String parseImg(String str) { return "http:" + str; } }