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相关推荐

  1. 从0 到1开发一款App(二):产品

    我们先回顾一下上篇文章,上篇文章中我们主要讲了四个部分的内容,分别是自我介绍.产品.开发<麻雀笔记>的初衷以及开发一款App的难易等问题.还没看过文章的朋友可以点击链接阅读: https: ...

  2. 开发一款app软件需要什么样的服务器

    现今互联网时代,人们的生活已经越来越离不来手机了,随着智能手机的普通,也催生了各种各样的APP应用程序,像QQ.微信,淘宝.美团.抖音.游戏等已经成为了只能手机的必备配置.这些APP数据存储在哪里呢? ...

  3. 个人或者企业怎么进行app开发?开发一款APP应用大概须要多少钱?

    App开发.是指专注于手机应用软件开发与服务. App是application的缩写,通常专指手机上的应用软件,或称手机client.另外眼下有非常多在线app开发平台.当然移动互联网时代是全民的移动 ...

  4. 开发一款APP需要阿里云服务器多大配置

    开发一款APP需要阿里云服务器多大配置 什么是APP? Application简称(APP)是手机软件的简称,可以安装在智能手机软件上,以改善原始系统的不足和个性化.使手机完善其功能并为用户提供更丰富 ...

  5. Android新手如何学习开发一款app?

    毫无疑问,开发一款自己的App对于初学者来说,无论从技术学习,还是找工作(或者装x),都是一大利器.那么如何才能快速上手,开发一款属于自己的app.本篇文章仅以自己的一些经验给更多的Android新手 ...

  6. 开发一款APP需要多少钱

    开发一款APP:需要多少钱 很多想做APP开发的客户,首先就是问价格,但是真正懂技术的就很难直接去回答.由于App的性质不同,导致了功能设置不同,那么开发的难易程度不同也决定了开发成本的高低和时间的长 ...

  7. 测试手机型号的软件,世界上有这么多型号的手机,开发一款App,该如何做测试?...

    如题,世界上有这么多型号的手机,苦逼的创业者开发一款 App 后,该如何做测试才好呢?某种意义上,早在 2011 年就成立的手机游戏及手机应用云测试平台"Testin云测"就是解决 ...

  8. 个人或者企业怎么进行app开发?开发一款APP应用大概需要多少钱?

    App开发,是指专注于手机应用软件开发与服务. App是application的缩写,通常专指手机上的应用软件,或称手机客户端.另外目前有很多在线app开发平台.当然移动互联网时代是全民的移动互联网时 ...

  9. 从0到1开发一款App(一):前言

    大家好,我是<麻雀笔记>App的开发者,随着新版本的上架,我也萌生了写一系列关于如何开发一款App的文章,这个系列打算就叫<从0到1开发一款App>了,是不是感觉很土low,没 ...

  10. 简单的安卓app小程序代码_开发一款APP大概需要多少钱?

    伴随着近几年移动互联网的飞速发展和智能手机的普及,为了更好地进行品牌营销和线上交易,越来越多的企业想要开发属于本身的手机app,所有企业在开发APP之前最关心的题目就是"开发一款手机APP到 ...

最新文章

  1. 斯坦福AI 5小时DNA测序破世界纪录!创人类新里程碑,成本仅3万
  2. 场景几何约束在视觉定位中的探索
  3. Python中fnmatch模块的使用
  4. 入门必看!给零基础新手的超快速色彩知识小科普
  5. Java三行代码搞定MD5加密
  6. 使用 csv 导入的方式在 SAP S/4HANA 里创建 employee 数据
  7. 2013_changchun_online
  8. 音视频开发(30)---新一代视频编码标准:HEVC、AVS2和AV1性能对比报告
  9. pandas后几行_天秀!Pandas还能用来写爬虫?
  10. data mining 1 concept
  11. SQL语句中查询数据
  12. Crosslink-NX器件应用案例(2): MIPI的多源合成(MUX)与分发(DeMUX)
  13. mmdetection3d SUN RGB-D数据集预处理
  14. android google map v2 获取当前位置,如何在google map v2中获取当前位置信息?
  15. git pull 报错 Your local changes would be overwritten by merge. Commit, stash or revert them to procee
  16. linux下sv高亮设置的详细教程
  17. 【计算机毕业设计】1.房屋租赁系统
  18. 绝地求生刺激战场经验总结
  19. matlab里点除,matlab中乘法“*”和点乘“.*”;除法“/”和点除“./”的联系和区别...
  20. k8s volume mysql_Kubernetes K8S之存储Volume详解

热门文章

  1. IC卡和ID卡的区别
  2. html里面<i>和<em>标签的区别
  3. mysql5.7从锁表吗_5分钟了解MySQL5.7的Online DDL雷区
  4. 义乌中学集训(没打的题慢慢补)
  5. 使用python随机取Reside数据集hazy文件夹中的图像并重命名另存于TrainA文件夹中
  6. asp万年历简易版本
  7. When Machine Learning Meets Congestion Control: A Survey and Comparison
  8. FlexBox 行间距
  9. java-IO流基础知识
  10. 下等人薄情,中等人深情,上等人……