Android RSS阅读器开发记录

本文约 3000 字,阅读需 6 分钟。

Android RSS阅读器开发记录

本文的时间跨度比较长,全程记录了我完成一个RSS阅读器的经历,包括踩过的坑以及自己的一些思考。

背景介绍

大概大一的时候我就见过RSS,但一直没明白这东西是干嘛的。很长一段时间自己都觉得没办法很高效地获取信息,使用微信公众号、微博、新闻客户端等虽然能保证时新性,但很多内容都不是我想要的;一些网站很不错,如每个编程语言的官网、知名社区、优质博客等,但是过于分散,而且更新频率不定,RSS正好解决了这个问题。 那么什么是RSS,参考维基百科的定义:

RSS(简易信息聚合)是一种消息来源格式规范,用以聚合经常发布更新数据的网站,例如博客文章、新闻、音频或视频的网摘。RSS文件(或称做摘要、网络摘要、或频更新,提供到频道)包含全文或是节录的文字,再加上发布者所订阅之网摘数据和授权的元数据。

简而言之,通过RSS我可以定制信息来源,而不用去我关注的网站逐一检查是否有内容更新。 其实,市场上已经有一些类似的APP,如Palabre(下图)、红板报等,但毕竟面对的还是所有群体,对于我来说里面99%的内容是不需要的。比如,我需要订阅的可能就是Python.ory等非常专业的网站的内容,集中在编程领域,显然不会有公司专门来做这个一个产品,毕竟受众太少了。 可能网上也有Android RSS阅读器的开源项目,但是就我的调查而言,应该没有特别优秀的(GitHub上1000+star),而且这个东西的实现也不算复杂,正好最近在学习Kotlin,正好可以用来练手。 基于以上这些背景,我开始开发这个APP了,大学几年,做过不少程序,但随着经历的增多,每次写代码时都会有不同的关注点,下文会多次提及。

设计实现

以前,记得自己大一时写过博弈论的仿真程序,还有贪吃蛇游戏,大概500-1000行,都放在一个文件里面。程序跑着突然发现缺了一个重要的逻辑,又删掉重写。当有了足够积累之后会发现,实现一个项目首先要做的是规划。当然我这个工程不算庞大,可能随便打打草稿就行。一个真正复杂的项目肯定需要更规范的计划。 一番整理之后,可将这个APP分解为几个问题:

  • 如何设计UI,需要为RSS分类
  • 使用过程中需要动态添加/删除RSS源,如何做到
  • RSS最终是服务器的XML数据,如何实现网络通信,如何解析XML
  • 每个RSS条目其实对应一个网页,用Android原生的WebView浏览网页效果能接受吗

UI设计

最终的效果如下: 在侧边栏实现一级分类(按照主题分类如新闻资讯、编程语言、网络…..),在每个页面的顶部实现二级分类(如编程语言可以分为Kotlin、Python、C++…..)点击二级分类后会刷新列表,每个二级分类对应着一组RSS,如上图对应的配置为

{
    "category": "编程语言",
        "websites": [
        {
            "tag": "Kotlin",
            "url": [
                "https://kotliner.cn/api/rss/latest",
                "https://blog.kotliner.cn/atom.xml"
            ]
        },
        {
            "tag": "Python",
            "url": [
                "https://www.python.org/dev/peps/peps.rss/"
            ]
        }
    ]
}

这个一段JSON格式的数据,下一节详细解释。 关于界面设计,是模仿Palabre的,曾经看过一句话:

模仿是最真诚的赞美

Palabre的UI却是挺好看。

碎岁念:UI设计得好不好?是否人性化?其实是设计的事情,Linus曾说让我设计界面,我宁可去死。但我觉得自己还是有必要系统了解下此方面的知识,毕竟过去、现在以及将来自己都可能要去独立开发项目,从技术的优化到用户界面的设计都要亲自操刀,所以还是要注意积累,总感觉书到用时方恨少。

数据源(debug版)

这里所说的数据源并不是RSS的数据源,而是一份配置文件,可以想象APP安装之后就不能修改了,而我每次在PC端发现一个好网站后总不能就去手机上把RSS地址手动输入吧,如果有一天我换手机了这些辛辛苦苦收集的RSS源怎么迁移? 所以一个比较好的方法就是把RSS源(一系列URL地址)放在服务器端,APP本地下载一份,每次启动后都下载一次(可以自己设置是否经常更新),检查版本是否更新(有一个version字段),如果有就替换本地的,下次启动就能用新的RSS源了,这样的好处是这个RSS源列表和APP本身解耦了,如果需要修改RSS源列表只需要在服务器修改就行了,也不会有备份问题了。 以上是自己的一个想法,在开发初这个优先级并不是很高,因为可能改变策略,所以放在最后实现。目前,我们把这个RSS源列表文件放assets目录打包进APP就行了,这样的好处是可以先解决其他更基础的问题。 如下是一个测试用的RSS源列表文件(字段都是自己按需定义的):

{
  "theme": "tech",
  "author": "zhaoyu",
  "email": "dutzhaoyu@gmail.com",
  "version": "0.01",
  "contents": [
    {
      "category": "综合版块",
      "websites": [
        {
          "tag": "业界资讯",
          "url": [
            "http://blog.jobbole.com/feed/"
          ]
        },
        {
          "tag": "个人博客",
          "url": [
            "https://www.liaoxuefeng.com/feed/articles"
          ]
        }
      ]
    },
    {
      "category": "编程语言",
      "websites": [
        {
          "tag": "Kotlin",
          "url": [
            "https://kotliner.cn/api/rss/latest",
            "https://blog.kotliner.cn/atom.xml"
          ]
        },
        {
          "tag": "Python",
          "url": [
            "https://www.python.org/dev/peps/peps.rss/"
          ]
        }
      ]
    }
  ]
}

网络通信

在一开始,我想要不要使用一个网络通信库,以前自己做的APP都是自己写个方法请求数据,经过面试、实习的洗礼,明白了熟悉主流开源库的重要性,但是目前还没有想法,因为这里无论是下载RSS源列表,还是拿到一个RSS源后下载XML数据,传输的数据都很小,而且Kotlin的网络编程比Java简洁很多,所以暂时没有使用网络库,因为

  • 网络传输不频繁
  • 传输数据很小 如果后面需要用也可以进行修改,为了尽快作出项目原型,这里直接用Kotlin原生API,两行代码即可。

JSON与XML解析

几个月前,我面试阿里(因为已经确定去腾讯了当然也没认真准备面试)时就被问到过JSON与XML的区别,当时自己说XML比JSON笨重,恍惚间记得网上如此说过。这两天一接触才发现自己回答的如此错误,具体区别可参考:

  • 为什么XML这么笨重的数据结构仍在广泛应用? - 知乎
  • [XML和JSON的客观比较])(http://www.reqianduan.com/801.html)
  • json与xml的区别 非常考要深度与广度的一个问题,当时竟然毫无察觉。 言归正传,如上面所说RSS源列表我定义了JSON表示,而具体到一个RSS的数据则是XML的,所以需要解析这两种格式。之所以不用一种(用XML表示RSS源列表,或者通过rss2json这样的网站把RSS转成JSON格式的)是为了跟深刻的体会两者的特点。 其实一个项目做完,如果完全是自己兴趣使然的话,我觉得有两点必须做好
  1. 每一个技术点都做足调研,做好技术选型,这样才能学到最多的东西
  2. 最后的产品必须精益求精,每个环节都尽力优化

JSON和XML的解析当然可以自己实现,但是考虑到开发效率和性能,开源库当然时更好的选择,JSON和XML的开源解析库有很多,大家可以自己搜索比较,选择合适自己的。最后我用gson进行JSON解析,用dom4j进行XML解析。关于开源库的使用也要做好三点:

  1. 快速熟悉同一功能开源库的特点,选择合适自己业务的库
  2. 能够通过阅读文档快速上手,如XML解析就需要对XPATH语法有所了解,而我之前并没有接触过
  3. 最好花时间阅读源码,通过源码可以学习成功项目的长处、更好地服务自己的业务,如果不阅读源码,库开源的意义就大打折扣了

详情浏览

代码重构-设计模式

性能优化

初始化顺序

缓存优化

代码重构-Android规范

数据源(release版)

工程拓展

日志上报

单元测试

总阅读量次。