因为最近身体不好又是偷懒了一阵子没有更新…这次带来的是一个在线的小说阅读器.目前已经实现了基本的功能,完成了大概的框架,剩余的部分慢慢来更新。先放上源码github https://github.com/CallMeSp/ToRead_MVP.git 求star。里面也有这个项目没有应用mvp结构的源码可以用来对比一下。
最近看了MVP框架,所以这个项目也采用了mvp框架,参考了mvp入门解析 、浅谈mvp入门由于经验不够,有些粗糙。还使用了picasso图片加载库,Jsoup来实现网页解析功能。先看一下代码结构
然后看一些效果图。
这就是用了MVP结构的代码结构了,明显感觉就是类的类别明显增多了,不过解耦性明显增强了,最大程度分离了view的交互和model的逻辑处理,view和model之间则通过presenter来沟通。
不过这又产生了一个问题:
这样一个view和一个presenter对应一个界面,要是一个完整的项目,界面肯定不少,那和以view和presenter会暴增,这样怎么办呢?
利用组合思想。V和P是一一对应的,但是,我们可以把通用的VP提取出来。一个Activity implements 多个View,然后利用组合包含几个P。举个例子。有个LoginPresenter。我们现在要在登陆页面中用到,另外在一个回复页面,也需要做个快速登陆功能。那么我们可能需要在LoginActivity和ReplyActivity中都包含这个LoginPresenter,两个Activity都各自去实现LoginView。可能ReplyActivity还有其他功能,他还要包含自己的ReplyPresenter,并实现自己的ReplyView。
利用组合来实现Presenter的复用,这个是MVP的优雅之一。但是别忘了不要持有View实例,记得detach。
然后言归正传,这个项目功能主要的实现依靠的是Jsoup的解析功能。来看一下bookbiz中根据搜索的书名来获取书籍列表的这一段。
@Override
public void showbookslist(final String searchname){
new Thread(new Runnable() {
@Override
public void run() {
try {
books.clear();
Document doc = Jsoup.connect("http://so.37zw.com/cse/search?q=" + searchname + "&click=1&s=2041213923836881982&nsid=")
.get();
Elements items=doc.select("div.game-legend-a");
for (Element Item : items) {
Log.e("0","Item:"+Item);
String title=Item.select("h3").text();
String detail=Item.select("p.result-game-item-desc").text();
String ur=Item.select("div.game-legend-a").attr("onclick");
ur=ur.substring(17, ur.length() - 1);
String writer=Item.select("p.result-game-item-info-tag").first().text();
String IMG=Item.select("img").attr("src");
book mybook=new book();
mybook.setBook_name(title);
mybook.setBook_writter(writer);
mybook.setBook_details(detail);
mybook.setBook_cover(IMG);
mybook.setContenturl(ur);
books.add(mybook);
}
presenter.updatelist(books);
} catch (IOException e){
e.printStackTrace();
}
}
}).start();
}
jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
jsoup的主要功能如下:
从一个URL,文件或字符串中解析HTML;
使用DOM或CSS选择器来查找、取出数据;
可操作HTML元素、属性、文本;此处运用的就是使用DOM选择器来查找和取出数据。本来相用正则来自己解析的..想想..还是算了吧..