8小时 用kotlin开发一款app
8小时 用kotlin开发一款app
整个项目所花时间:2018年1月1日10:20~2018年1月1日18:27 花了很多时间去爬数据
项目地址: https://github.com/xfhy/DeepNight-in-kotlin
下载试玩:
http://fir.im/lga9
一.项目简介
一款纯看妹子的app,素材全部来源于正经图库(如有侵权,请立马告诉本人,本人邮箱xfhy666@qq.com,我定立刻删除),本app仅做学习交流使用,勿做商用.请注意,全是正经图片,可别想歪了哈.
由于时间非常紧急,于是没有用MVP,RxJava2,Retrofit这些都没用.直接用的anko的common库,很方便就可以异步操作和UI线程切换等,为了节约点时间.
直接上图吧,哈哈,图来得直接些(本来是gif的,结果不能上传那么大的):
说实话,项目中有很多需要优化的地方,但是时间确实有点短,来不及了,很多地方命名不规范,因为我每次想命名需要花很多时间,以前我每一个命名都是仔细思考过的.然后很多地方没有注释,也是来不及了.平时我非常注重注释.
二.用到的知识点
- kotlin 语言
- 数据类
- 伴生对象
- 单例
- 扩展
- 闭包
- …
- anko
- jsoup 爬取网页数据的库
- Material Design 风格
- Recyclerview 瀑布流
- CardView
- Glide 加载图片
- BaseQuickAdapter 以前自己搞的一个adapter,方便快速开发
- DrawerLayout
- NavigationView
- Toolbar
- 下拉刷新,上拉加载
- fragment懒加载
大概就是上面这些了
三.爬取数据
网站非常规律,看看jsoup用法很容易就搞到手啦,下面是详细方法.
首先,我们打开网站,查看网页源代码,可以看到各个分类的网址,待会儿我们可以根据用户选择的分类去爬对应分类的数据.
然后再来看看,每个分类首页(第一页)其实是有一些图片,我们待会儿需要筛选出这些图片的详情页地址,并且这些图片地址我们可以用来展示到app的分类首页上.其实各分类是不止一页的,它们的规律是从第二页末尾就是index_x.shtml结尾,其中x为当前页索引.http://www.msgao.com/dqfl/om/index_2.shtml
我们使用Jsoup开源库去爬取数据,关于Jsoup,其实使用起来非常简单,而且官方还非常人性化的有中文文档,地址.
首先,我们是通过以下方式连接上url
//连接val document: Document = Jsoup.connect(buildUrl).get()
然后我们筛选那些有图片链接的
//筛选首页全部的链接 暂时是第一页的
val htmls: Elements = document.select("a[href$=.shtml]")//筛选是可以点击进去详情的url
htmls.forEachReversedByIndex {val realUrl = it.getElementsByClass("div-img")//不正确的全部移除if (realUrl.size == 0) {htmls.remove(it)}
}
接着是获取图片地址和图片标题
//外层列表的bean集合
val outLists: ArrayList<DivListImgBean> = ArrayList()
htmls.forEach {val divListImgBean = DivListImgBean("", "","")val linkElements = it.getElementsByClass("link")divListImgBean.detailsUrl = linkElements.attr("href")//获取图片地址val imgSrcs = it.select("img[src\$=.jpg]")imgSrcs.forEach {val src = it.attr("src")val alt = it.attr("alt")divListImgBean.src = srcdivListImgBean.text = alt}//添加bean到集合中outLists.add(divListImgBean)
}
加入用户点击了某个图片链接,我们就去抓取图片详情页,所有的图片链接,进行该美女的详情展示.在方法上和上面的方法大同小异.
看代码吧,比我说的更清楚.结合jsoup 开发文档和网页源码一起看哟
import com.xfhy.deeplibrary.common.LogUtil
import com.xfhy.deepnight.bean.DivListImgBean
import org.jetbrains.anko.collections.forEachReversedByIndex
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.select.Elements/*** @author xfhy* create at 2018/1/1 12:36* description:*/
object NetUtils {/*** 获取外部的列表页的list* @param url url* @param index 索引 从1开始* @param response 回调数据*/fun reqOutList(url: String, index: Int, response: ZResponse) {doAsync {try {//组装urlvar buildUrl = "${url}index${if (index == 1) "" else "_$index"}.shtml"LogUtil.e("buildUrl = $buildUrl")//连接val document: Document = Jsoup.connect(buildUrl).get()//筛选首页全部的链接 暂时是第一页的val htmls: Elements = document.select("a[href$=.shtml]")//筛选是可以点击进去详情的urlhtmls.forEachReversedByIndex {val realUrl = it.getElementsByClass("div-img")//不正确的全部移除if (realUrl.size == 0) {htmls.remove(it)}}//外层列表的bean集合val outLists: ArrayList<DivListImgBean> = ArrayList()htmls.forEach {val divListImgBean = DivListImgBean("", "","")val linkElements = it.getElementsByClass("link")divListImgBean.detailsUrl = linkElements.attr("href")//获取图片地址val imgSrcs = it.select("img[src\$=.jpg]")imgSrcs.forEach {val src = it.attr("src")val alt = it.attr("alt")divListImgBean.src = srcdivListImgBean.text = alt}//添加bean到集合中outLists.add(divListImgBean)}LogUtil.e(outLists.toString())uiThread {response.onSuccess(outLists)}} catch (e: Exception) {uiThread {response.onError(e.message)}}}}/*** 详情列表*/fun reqDetails(url: String, response: ZResponse) {doAsync {try {//连接val document: Document = Jsoup.connect(url).ignoreContentType(true).get()val girlPictureList = document.select("div.div-num")val imageList: ArrayList<String> = ArrayList()girlPictureList.forEach {if (it.hasAttr("data-src")) {var imgUrl = it.attr("data-src")imgUrl = imgUrl.substring(0, imgUrl.indexOf("?"))imageList.add(imgUrl)}}LogUtil.e(imageList.toString())uiThread {response.onSuccess(imageList)}} catch (e: Exception) {uiThread {response.onError(e.message)}}}}}
四.构建UI
我是采用的侧滑风格的app,中间的数据全部采用fragment来填充的,fragment只有在显示后才加载数据(懒加载机制),不会浪费过多流量.
素材取自阿里矢量图标库.阿里妈妈MUX倾力打造的矢量图标管理、交流平台。
设计师将图标上传到Iconfont平台,用户可以自定义下载多种格式的icon,平台也可将图标转换为字体,便于前端工程师自由调整与调用。下载图标完全免费,而且还可以调整颜色和大小,更有SVG下载,简直爽翻天.对于我这种一点儿也不会制作图标的菜鸟级程序员来说,简直就是福利.
五.总结
其实,将一个没有防爬的网站撸成app还是比较简单的,基本上都是这个套路,大家也可以试试.比如内涵段子等,做成app,然后平时可以自己用,还可以给朋友用,还锻炼了自己所学的知识,何乐而不为呢.
kotlin开发起来真的很顺手,也很方便,就像平时说话一样,很顺畅.大家要学习kotlin的话,建议多看看kotlin的官方文档.
8小时 用kotlin开发一款app相关推荐
- 从0 到1开发一款App(二):产品
我们先回顾一下上篇文章,上篇文章中我们主要讲了四个部分的内容,分别是自我介绍.产品.开发<麻雀笔记>的初衷以及开发一款App的难易等问题.还没看过文章的朋友可以点击链接阅读: https: ...
- 开发一款app软件需要什么样的服务器
现今互联网时代,人们的生活已经越来越离不来手机了,随着智能手机的普通,也催生了各种各样的APP应用程序,像QQ.微信,淘宝.美团.抖音.游戏等已经成为了只能手机的必备配置.这些APP数据存储在哪里呢? ...
- 个人或者企业怎么进行app开发?开发一款APP应用大概须要多少钱?
App开发.是指专注于手机应用软件开发与服务. App是application的缩写,通常专指手机上的应用软件,或称手机client.另外眼下有非常多在线app开发平台.当然移动互联网时代是全民的移动 ...
- 开发一款APP需要阿里云服务器多大配置
开发一款APP需要阿里云服务器多大配置 什么是APP? Application简称(APP)是手机软件的简称,可以安装在智能手机软件上,以改善原始系统的不足和个性化.使手机完善其功能并为用户提供更丰富 ...
- Android新手如何学习开发一款app?
毫无疑问,开发一款自己的App对于初学者来说,无论从技术学习,还是找工作(或者装x),都是一大利器.那么如何才能快速上手,开发一款属于自己的app.本篇文章仅以自己的一些经验给更多的Android新手 ...
- 开发一款APP需要多少钱
开发一款APP:需要多少钱 很多想做APP开发的客户,首先就是问价格,但是真正懂技术的就很难直接去回答.由于App的性质不同,导致了功能设置不同,那么开发的难易程度不同也决定了开发成本的高低和时间的长 ...
- 测试手机型号的软件,世界上有这么多型号的手机,开发一款App,该如何做测试?...
如题,世界上有这么多型号的手机,苦逼的创业者开发一款 App 后,该如何做测试才好呢?某种意义上,早在 2011 年就成立的手机游戏及手机应用云测试平台"Testin云测"就是解决 ...
- 个人或者企业怎么进行app开发?开发一款APP应用大概需要多少钱?
App开发,是指专注于手机应用软件开发与服务. App是application的缩写,通常专指手机上的应用软件,或称手机客户端.另外目前有很多在线app开发平台.当然移动互联网时代是全民的移动互联网时 ...
- 从0到1开发一款App(一):前言
大家好,我是<麻雀笔记>App的开发者,随着新版本的上架,我也萌生了写一系列关于如何开发一款App的文章,这个系列打算就叫<从0到1开发一款App>了,是不是感觉很土low,没 ...
- 简单的安卓app小程序代码_开发一款APP大概需要多少钱?
伴随着近几年移动互联网的飞速发展和智能手机的普及,为了更好地进行品牌营销和线上交易,越来越多的企业想要开发属于本身的手机app,所有企业在开发APP之前最关心的题目就是"开发一款手机APP到 ...
最新文章
- 斯坦福AI 5小时DNA测序破世界纪录!创人类新里程碑,成本仅3万
- 场景几何约束在视觉定位中的探索
- Python中fnmatch模块的使用
- 入门必看!给零基础新手的超快速色彩知识小科普
- Java三行代码搞定MD5加密
- 使用 csv 导入的方式在 SAP S/4HANA 里创建 employee 数据
- 2013_changchun_online
- 音视频开发(30)---新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
- pandas后几行_天秀!Pandas还能用来写爬虫?
- data mining 1 concept
- SQL语句中查询数据
- Crosslink-NX器件应用案例(2): MIPI的多源合成(MUX)与分发(DeMUX)
- mmdetection3d SUN RGB-D数据集预处理
- android google map v2 获取当前位置,如何在google map v2中获取当前位置信息?
- git pull 报错 Your local changes would be overwritten by merge. Commit, stash or revert them to procee
- linux下sv高亮设置的详细教程
- 【计算机毕业设计】1.房屋租赁系统
- 绝地求生刺激战场经验总结
- matlab里点除,matlab中乘法“*”和点乘“.*”;除法“/”和点除“./”的联系和区别...
- k8s volume mysql_Kubernetes K8S之存储Volume详解