前几天晚上,百度移动端搜索发生故障,搜索请求无法显示结果,经历了42分钟后故障解决。据估计,故障期间有上亿次的手机搜索受到影响。就在近日,工信部紧急约谈了百度公司,并责令立即针对此次事故深入调查,3日内向工信部提交书面报告。有趣的是,阿里和腾讯也因为躺枪,工信部下发了紧急通知,要求阿里和腾讯吸取百度的教训,并且要会举一反三。
作者简介漫长的一周终于结束了,先提前祝大家周末愉快!
本周的最后一篇文章来自 黎赵太郎 的投稿,分享了个人开发一款APP并上架的经验。由于篇幅限制,我这里只挑出了文章的主要部分,感兴趣的朋友可以访问下面的博客地址查看全部内容。
黎赵太郎 的博客地址:
前言http://www.jianshu.com/u/49606f4d970f
目标:实现纸飞机App - 采用MVP架构,集合了知乎日报、果壳精选和豆瓣一刻的综合性阅读客户端。项目地址:
https://github.com/marktony/PaperPlane
效果图如下所示:
本次教程分为7天,内容分别为:
第一天,准备
功能需求
可行性分析
其他准备
第二天,UI
选择合适的UI
第三天,整体架构
第四天,首页列表
界面编写
实体类
显示数据
缓存内容
第五天,详情页与其他
界面编写
实体类
显示数据
设置与关于
第六天,高级功能
夜间模式
版本适配
第七天,发布与开源
在Google Play上线
在GitHub开源
思考
好了,废话不多说了。现在就开始吧。
DAY 1
俗话说,万事开头难,准备工作做好了,可以起到事半功倍的作用。磨刀不误砍柴工嘛。
功能需求
在开始正式编码之前,咱们还是得先把要实现的功能一一列出来,后面实现起来才有方向嘛。我认为咱们需要实现的功能有:
正确获取消息列表并展示
能够获取历史消息
展示内容详情
后台自动缓存内容详情,方便用户在无网络连接时查看
收藏特定消息
夜间模式
一共6个大的需求,不多,但是我们仔细的研究一下,实际上这6个需求涉及到了网络,UI,数据存储,后台服务等内容。相信对于聪明的你不算困难,现在我们来研究一下可行性。
可行性分析
我们首先需要考虑的问题就是:数据从哪里来?感谢开源,GitHub上 izzyleung 大神分析了知乎日报的API并开源了,项目地址请戳这里:
知乎日报 API 分析
https://github.com/izzyleung/ZhihuDailyPurify/wiki/%E7%9F%A5%E4%B9%8E%E6%97%A5%E6%8A%A5-API-%E5%88%86%E6%9E%90
分析的非常详细,纸飞机项目在初期,也就是版本3.0之前也只使用了这一个API,在3.0之后还使用果壳精选和豆瓣一刻的API。如果你还想要展示更多的内容,可以戳这里(收集了一些国内外常用的API):
Awsome_API
https://github.com/marktony/Awesome_API
我们来粗略的看一下数据的内容。获取知乎日报2017年1月22日的消息列表:
http://news-at.zhihu.com/api/4/news/before/20170122
服务器向我们返回JSON格式的内容:
OK,获取到了列表之后,我们就可以获取详细的内容了,例如,我们获取id为9165434的内容,只需要将id拼接到 http://news-at.zhihu.com/api/4/news/ 之后:
http://news-at.zhihu.com/api/4/news/9165434
获取到的内容为:
body 字段中就是html格式的内容详情,我们就可以使用 WebView 来展示了。当然,知乎日报的API接口不止上面的两个,你可以点击上面的链接查看。获取果壳精选和豆瓣一刻的内容,你可以在我的项目中直接查看文件Api。
其他准备
工欲善其事,必先利其器。工具准备好总是没错的。其他不多说,推荐一款功能强大的网页调试与发送网页 HTTP请求 的Chrome插件,我们做网络请求分析时需要用到:
Postman
https://www.getpostman.com/docs/introduction
好了,第一天的工作差不多就是这么多,熟悉一下API,把工具备好,收拾一下心情,准备明天的工作。
DAY 2
今天主要完成的是UI设计。你可能会问了,这不是设计师的工作么。然而,我在开发纸飞机的过程中,并没有射鸡湿这种生物,UI就我自己完成了。相信大多数的程序员,美术方面应该不是那么地擅长。
当然,有美术和相关基础的同学可以试试用Sketch或者PS把原型图画出来,对于没有美术基础的童鞋,最简单的方法当然就是模仿现成的APP了。当然,你也可以在下列网站寻找合适的设计图:
Dribbble
https://dribbble.com
UpLabs
https://www.uplabs.com
UI中国
http://www.ui.cn
站酷ZCOOL
http://www.zcool.com.cn
另外,还有一些小的注意事项:
1. 遵守Material Design设计规范 - 这不是强制性的要求,但是,既然我们是开发一款Android App,如果我们自己都不遵守规范,还怎么指望Android环境变好呢。
2. 正确使用BottomNavigation - BottomNavigation 作为 Google 的打脸之作,诞生之初就倍受争议。我个人的建议是使用 TabLayout 代替底部导航,这是涉及到信仰的大事情。如果一定要用,请不要把iOS上的标准直接放在Android上使用,请参考这一篇文章:
Material Design 中的 Bottom Navigation 并不是无脑移植 iOS 导航模式的许可证
https://zhuanlan.zhihu.com/p/22005972
并且,我向你投来一个鄙视的眼神。
3. 使用正确的图标 - 尽量使用 https://material.io/icons 网站上的图标,如果你使用iOS版本的图标,我再次向你投来一个鄙视的眼神。
首页使用 Drawer 作为*导航,Tab 为二级导航,列表项使用卡牌布局,使用 FloatingActionButton 作为日期选择按钮;详情页面使用可收缩的 Toolbar,图片搭配文字的形式。其他高深的我也不懂了。到后面你会发现,这里我犯了一个错误,卡牌布局用在这里是不合适的。参见:
https://material.io/guidelines/components/cards.html#cards-usage
DAY 3
现在开始就要真正的写代码了。新建Android Studio项目什么的就不说了,下面的是我的项目结构图:
不难看出,我是按照页面和功能进行分包的。
包建立完成后,我们开始导入第三方的开源库,便于简化代码的编写和实现特定的效果。找到工程目录下app文件夹,打开 build.gradle 文件,添加如下内容。
由于一些历史遗留问题,我并没有使用 OkHttp 作为网络请求包,而是选择了 volley。如果你有一定的基础,可以选择使用 OkHttp。
导入volley有两种方式:
1. 在 app目录 下的 lib目录 下粘贴volley的jar包,你可以在这里下载到:
https://github.com/marktony/PaperPlane/blob/master/app/libs/library-1.0.19.jar
2. 当然也可以通过 gradle 引入:
compile 'com.android.volley:volley:1.0.0'
首先是整体的架构:MVP。关于整体架构的选择以及更加详细的介绍部分,可以戳这篇文章:
重构!将Google-MVP应用于已有项目
https://marktony.github.io/2016/09/27/%E9%87%8D%E6%9E%84%EF%BC%81%E5%B0%86Google-MVP%E5%BA%94%E7%94%A8%E4%BA%8E%E5%B7%B2%E6%9C%89%E9%A1%B9%E7%9B%AE
这里我们仿照Google的 Android Architecture Blueprints [beta] 中的:
todo-mvp
https://github.com/googlesamples/android-architecture/tree/todo-mvp
1. 首先创建最基本的 BaseView 和 BasePresenter,他们分别是所有 View 和 Presenter 的基类。
2. 然后创建一个契约类,用于统一管理 View 和 Presenter。这里以知乎日报的部分为例(如果没有特别说明,后面的代码均以知乎日报的部分为例,果壳精选与豆瓣一刻的代码类似,详细代码可以在 GitHub 的 repo 中找到)。
ZhihuDailyContract.java
3. 在上面已经分好的子包中,创建相应的子类 View 和 Presenter。
4. 创建 VolleySingleton,即 Volley的单例。这样,整个应用就可以只维护一个请求队列,加入新的网络请求也会更加的方便。
5. 然后是 Model层 的实现。使用了 Gson 之后,对JSON的转换更加方便了,所以,我们只需要返回类型为String即可。
定义了两个方法,分别为请求成功时和请求失败时的回调。
然后定义一个 StringModel 的实现类 StringModelImpl:
5. 到这里,基本的架构就搭建完成了。现在可以喝杯咖啡,然后完成今天的最后一点工作,为后面的工作做准备。
创建 Api.java 文件,用于存储app所用到的所有API:
创建 NetworkState.java 文件,判断当前的网络状态,是否有网络连接,WiFi或者是移动数据:
创建 DateFormatter .java 文件,方便将 long类型 的日期转换为 String类型。
OK,day 3工作完成。
由于篇幅限制,后续内容可 访问开头作者博客 或 点击最后阅读原文!
更多每天学习累了,看些搞笑的段子放松一下吧。关注最具娱乐精神的公众号,每天都有好心情。
如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。
欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号: