前段时间有些兄弟问我没有可用于毕业答辩的项目。呼之前来,我给他们介绍了很多,最近介绍一个适合学习的开源的开源项目——豆瓣客户端

部分特性

  • Material Design
  • 首页友邻广播
  • 启动速度优化
  • 界面动画
  • 支持屏幕旋转
  • 平板多列视图
  • 支持使用 Custom Tabs 打开网页
  • 支持切换长/短链接显示

放几张效果图吧

功能架构

导航采用抽屉一级导航 + 选项卡二级导航的方式。工具栏上将显示全局的动作。

  • 工具栏
    • 提醒:所有类别的提醒,可以查看历史提醒
    • 豆邮:用户间的邮件往来,希望鼓励郑重而非聊天。
    • 搜索:立即访问想要的内容。
  • 用户:点击后显示个人页面,相当于“我的豆瓣”。
  • 首页
    • 友邻广播:友邻互动、友邻推荐、系统定制的推荐。
    • 九点:友邻的日记、博客文章等,有深度的内容。
    • 一刻:全站范围的热门内容推荐。
    • 同城:基于地理位置的内容。
    • 线上活动:基于共同兴趣的内容。
  • 读书
    • 分类浏览、首页推荐:入口,以及最有可能发现新内容的地方。
    • 我读:管理自己的读书标记、创造内容。
    • 动态:查看友邻的阅读动态,互动、获得推荐。
    • 豆瓣猜:基于算法的推荐。
  • 电影
    • 类似读书。
  • 音乐
    • 类似读书。
  • 设置:提供应用设置等。

在子页面设计中,豆芽将尽量鼓励长内容和用心的互动。因为我相信只有豆瓣值得这样尝试。

实现架构

数据层面

应用除了对少数内容进行缓存,其他内容均直接从网络获取。

  • 基于 Android 账户系统提供用户账户和身份认证。
  • 使用 Retrofit 及部分自定义增强处理网络请求。
  • 使用 Gson 自动填充数据模型。
  • 使用 Glide 加载图片。
  • 使用 DiskLRUCache 及自定义增强对首页数据进行缓存。
  • 使用 EventBus 同步不同页面间对象状态。

界面层面

  • 使用 Support Library 中的 AppCompat、Design、CardView、RecyclerView 进行 Material Design 实现,在必要时引入/自己写作第三方库以实现部分界面元素和效果。

= 使用框架的 Shared Element Transition 实现在 Android 5.0 以上的界面过渡动画。

  • 界面实现一般分为 Activity、Fragment、Adapter 三个模块,分别负责作为容器,发起请求、展示数据和用户交互,以及数据/交互绑定。

实现难点

  • 网络请求

    Retrofit 本身已经较为强大,而在豆芽中则对 Retrofit 进行了包装,增加了认证和错误处理等功能,为之后 API 层建立提供了很多方便。

  • 磁盘缓存

    DiskLRUCache 是一个只实现了同步读取写入的库,因此豆芽对其进行了包装,提供了异步读写的 API,正确实现,提高了应用的响应速度。

  • 状态同步

    由于各个界面独自获取数据,数据本身与常规的 ContentProvider 机制中不同,是去中心化的,即可能遇到状态不同步的问题。

    具体地说,即有可能用户在广播详情界面中点赞后,回到主界面列表视图,发现并未更新状态。

    而豆芽解决方案则是使用 EventBus,在请求完成后通知所有界面刷新同一数据。

  • 界面动画

    Android 5.0 以上提供了 SharedElementTransition,然而默认情况下共享的界面元素在动画时却会被放置在其他界面元素之上,导致其突然越过 AppBar 或 StatusBar 的情况。

    通过大量的文档阅读、源代码分析和调试,经过大约一周的时间,最终实现了较为理想的效果。

  • 屏幕旋转

    Android 在屏幕旋转时,会销毁视图和 Activity 并重建,此时如何保存视图状态和已加载的数据、正在进行的网络请求即是问题。

    Android 对部分视图状态提供了自动保存恢复,而豆芽对于其他需要保存的状态则通过自定义的 onSaveViewState() 和 onRestoreViewState()。

    对于数据,豆芽通过自定义的一个无界面的 RetainDataFragment 进行数据保留,并且接口十分简单易用。

    同时,由于网络请求的异步特性,豆芽通过自定义的一个 RequestFragment 实现了网络请求在 Activity 重建期间的保留,并且能够在 Activity 重建完成后将请求前的状态和请求结果回调至新的 Activity。

  • 平板适配

    Android 本身的资源系统提供了对不同配置的很好支持,通过建立不同的资源文件,即可在手机和平板上使用不同的界面设定。

    此外,由于采用了 RecyclerView,通过在运行时判断当前设备配置,可以动态给界面设置为 1、2、3 列视图,充分利用屏幕空间。

  • 启动速度

    Android 默认在冷启动应用进程至能够调用 Activity.onCreate() 前会加载应用主题中的背景作为预览,而默认背景是白色,与应用在上部拥有绿色 AppBar 的效果不相匹配。

    为了生成适应于不同屏幕大小、系统版本的图片,我使用 bash 编写了一系列脚本,并实现了一个通用的模板化 SVG 格式,详情见 MaterialColdStart 和 AndroidSVGScripts。

经过自定义窗口背景和其他优化,应用在手机上已经可以达到立即启动的视觉效果。

项目地址

https://github.com/DreaminginCodeZH/Douya

相信自己,没有做不到的,只有想不到的

如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :644196190 微信公众号:终端研发部

技术+职场