【Android开发】微信精选,文章资讯类App开发记录总结
缘起
微信精选的App开发来源是在聚合数据上看到了有免费的微信精选的数据接口,无限调用。相对于其他的诸如违章查询,医药查询,NBA赛事等等,我感觉还是微信文章精选这个数据接口离我最近,所以想着拿着个数据源练练手。
另外,有个笑话的接口我感觉还挺有意思的,也做成了一个APP,已经上线,可以在我的上一篇文章中看到详细的介绍。
雏形
在这个App进入大家视野之前我已经做了一版,是用到了各方的库拼凑而成的,也实现了基本的列表、阅读文章的功能,里边的下拉刷新,加载更多,进度条都是用的不同方的,整体的结构感和风格太差。这也是我不是很满意的地方。
但就是在做上一个App——找乐,我发现了一个新的可以反复复用,结构明显,易于使用,风格统一的框架——Beam(Beam)。这个MVP结构的结构框架已经集成好了列表界面的刷新、加载更多、错误提示、进度提示等等,这用起来也太方便了!所以我花了一天的时间对之前写的应用进行了重构,删除了不少代码,并且使用了MVP模式的整个App结构看起来非常舒服。以后如果自己做App就用这个框架(求推荐其他的框架),开发效率大大提升。
这个是App重构后的样子:
本项目已经开源:https://github.com/fuxuemingzhu/WeChoice,欢迎Star和Fork。
开发
这种类似新闻客户端的开发经验较少,在看了其他的客户端之后发现基本都差不多,那我就从简开发吧。
框架
对于Beam框架,搭配上EasyRecyclerView,这样的MVP架构对生命周期的管理特别好,比如刷新、加载、错误提示、进度条等等,大家试用了这个微信精选App后可能也会有这样的感受,所有的东西展示不是那么突兀,显得很连贯,这要感谢框架的作者的贡献,也对大家推荐这个框架Beam.
估计这个框架可能节省了我开发项目的2/3的时间。
数据
前文已经说了,使用的聚合数据的微信精选的接口https://www.juhe.cn/docs/api/id/147,其实对于这个接口不是非常满意,因为功能有点少嘛。但是无限制调用这个还是可以拿来练手的。
我开源的数据中没有把聚合数据的AppKey给公开,如果需要基于本项目改造的,请自行申请APPKey.
设计
本来打算用CardView来实现卡片效果,但是发现CardView会自动设置为阴影效果和圆边,这样就要求数据之间要有间隙。但在Google的Material Design中,我的这种想法是不推荐的。
下图中,左边为推荐,右边不推荐:
理由是:
Don’t.
The use of cards here distracts the user from being able to quickly scan. These list items are also not dismissable, so having them on separate cards is confusing.
好吧,在我多次希望能通过调节Card之间的间隙达到比较满意的推荐效果时,发现做不到,好吧,那只有乖乖用普通的FramLayout了。效果大家也都看到了。
技术亮点
双队列实现数据加载不重复
在找乐App中没有做这个功能,就是在下拉刷新的时候可以不停地更新数据。大家做开发的都明白,数据是按页返回的,一般下拉的时候默认的就请求了第一页的数据,因此数据基本都是原来的数据。在微信精选这个App中,我用了双队列——下拉刷新队列和上拉加载更多队列,来实现了这个记载数据不重复的问题。
道理很简单:记录下来已经加载的页数,下次想服务器请求的时候不去请求已经加载过的页,这样就可以实现数据不重复。
至于用队列,是因为聚合数据的数据页数有限(只有25页),我把下拉刷新队列存放的页数设置成了10,也就是说在下拉10次之内不会出现重复数据,第11次刷新的时候把对第一次放入队列的数字出列。上拉加载更多的页数设置为25,在25次上拉之后清空队列。
每次新数据的进入是使用的随机数的方式。嗯。
具体实现如下:
private int morePages = 1;
final int QUEUE_SIZE = 10;//队列大小
//手写队列用来存储已经加载过的文章页数
Queue<Integer> refreshQueue = new LinkedList<>();
Queue<Integer> moreQueue = new LinkedList<>();
int page = 1;
@Override
public void onRefresh() {
super.onRefresh();
if (refreshQueue.size() == QUEUE_SIZE) {
refreshQueue.poll();
}
refreshQueue.offer(page);
moreQueue.clear();
moreQueue.offer(page);
ChoiceModel.getInstance().getChoice(page, new DataCallback() {
@Override
public void success(String info, ChoicePage data) {
getAdapter().clear();
getAdapter().addAll(data.getContentlist());
while (refreshQueue.contains(page)) {
page = (int) Math.ceil(Math.random() * 25);
}
JUtils.Log("refreshQueue", refreshQueue.toString());
}
@Override
public void error(String errorInfo) {
getView().showError(new Throwable(errorInfo));
}
});
}
@Override
public void onLoadMore() {
super.onLoadMore();
while (moreQueue.contains(morePages)) {
morePages = (int) Math.ceil(Math.random() * 25);
}
if (moreQueue.size() == 25) {
moreQueue.clear();
moreQueue.offer(page);
}
moreQueue.offer(morePages);
JUtils.Log("moreQueue", moreQueue.toString());
ChoiceModel.getInstance().getChoice(morePages, new DataCallback() {
@Override
public void success(String info, ChoicePage data) {
getAdapter().addAll(data.getContentlist());
}
@Override
public void error(String errorInfo) {
getView().showError(new Throwable(errorInfo));
}
});
}
解决WebView选择框弹出时将ToolBar下推问题
长按WebView中的文字,会弹出上下文选项,ToolBar会下推。如下图1。
参考了狐狸大神的文章:解决ToolBar在显示上下文菜单中被推下的问题
只是在AppTheme style中一行代码的事情:
<item name="windowActionModeOverlay">true</item>
或者如下,根据安卓版本而不同:
<item name="android:windowActionModeOverlay">true</item>
效果如下:
缺陷
其实不满意的地方挺多的= =,这里主要说一下最不满意的地方,就是WebView这一块。加载文章详情的时候,这个原生WebView很不好用!
- 很差的进度提醒机制
- 很差的错误识别与处理机制
- 很差的数据重新记载体验
- 无法查看大图
感觉每个都很影响体验,目前的实现非常不爽,代码看了代码之后就会知道我为了识别网页错误在多少地方做了监听处理。而且查看大图和下载也没有实现。
希望大家能给出好的WebView的封装框架,因为我一直没找到这方面的开源项目。
同时缺少了分享模块、搜索模块。
截图
下载
- 小米应用商店
- 应用宝
- 豌豆荚
- Fir.im:http://fir.im/wechoice
二维码:
(暂时只能通过Fir,其他的应用商店还在审核,应用宝审核已被打回两次,你懂。)
总结
花了一整天对项目进行了重构,优化了一天处理界面、开源和本博客,时间其实还是没用很多的。再次感谢这个框架Beam,真是程序员的福音。
这个项目本来不打算开源的,但是我感觉用了框架之后自己写的东西就很少了,干脆开源。
但是本作者保留一切商业化的权利。
一切基于本项目的修改都必须开源,并且采用相同的开源协议。
好了,本项目的地址是:https://github.com/fuxuemingzhu/WeChoice,欢迎Star和Fork。
【Android开发】微信精选,文章资讯类App开发记录总结的更多相关文章
- iOS开发之常用资讯类App的分类展示与编辑的完整案例实现(Swift版)
上篇博客我们聊了<资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0)>,今天的这篇博客就在上篇博客的基础上做些东西.做一个完整的资讯类App中的分类展示 ...
- iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)
今天博客中,我们就来实现一下一些常用资讯类App中常用的分类选择的控件的封装.本篇博客中没有使用到什么新的技术点,如果非得说用到了什么新的技术点的话,那么勉强的说,用到了一些iOS9以后UIColle ...
- 分享一下怎么开发一款图片视频类App,秒拍和prisma
第一步,分解短视频App的功能 我们在秒拍官网看到如此描述: [视频拍摄及导入]支持直接拍摄及导入手机本地的视频 [照片电影]照片专属特效,轻松创作照片电影 [MV特效]10余款全新MV特效,让普通视 ...
- 史上最简单的个人移动APP开发入门--jQuery Mobile版跨平台APP开发
书是人类进步的阶梯. ——高尔基 习大大要求新新人类要有中国梦,鼓励大学生们一毕业就创业.那最好的创业途径是什么呢?就是APP.<构建跨平台APP-jQuery Mobile移动应用实战> ...
- 产品开发也要看阵容,APP开发只需五步变得靠谱
最早认识的一个朋友是程序员,曾经到一家外包公司接单子,小外包公司经常遇到的问题就是和需求方谈产品功能.客户要做外包,对方让他一次性报价,但是客户连功能点自己都不清楚,这时朋友说还是按照具体功能点来做吧 ...
- webstorm开发微信小程序代码提醒(webstorm开发工具)
使用了微信提供的开发工具是真心难用,卡顿厉害.中英文切写注释换相当不爽.还没办法多开窗口,相信大家也遇到过这种现象. 下边我们介绍下webstorm来开发微信小程序的一些配置: File---sett ...
- app开发制作会难吗?app开发好学吗?
前面我们讲到了app是什么,APP是运行在智能手机的第三方应用程序,可以满足用户的不同需求.那么app开发制作会难吗?这个与产品的复杂度有很大的关系,复杂度包括业务逻辑多不多,业务模块多不多等,对于玩 ...
- Android中微信抢红包插件原理解析和开发实现
一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...
- 贷款资讯类APP、贷款资讯网站廉价卖,需要的进来看看
[app介绍]卡贷资讯app为您提供信用卡申请攻略及借款资讯以及贷款口子,让你借钱借款路上不再愁.[功能特点]1.资讯:聚合各种贷款资讯知识,掌握核心信用卡申请攻略,借款借钱不亏,亦不被骗:2.工具: ...
随机推荐
- 学习java的第二十六天
一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...
- acquire, acre, across
acquire An acquired taste is an appreciation [鉴赏] for something unlikely to be enjoyed by a person w ...
- 零基础学习java------31---------共享单车案例,html快速入门(常见标签,get和post的区别)
一 .单车案例 二. HTML快速入门 红字表示要掌握的内容 超文本标记语言,此处的标记指的即是关键字,其用处是用来写页面(展示数据). 语法:(1)./当前目录:../ 父级目录 (2)注释符号: ...
- 100个Shell脚本——【脚本7】批量建立用户
[脚本7]批量建立用户 编写shell脚本,批量建立用户user_00, user_01, ... user_100并且所有用户同属于users组. 一.脚本 #!/bin/bash group=`c ...
- Linux学习 - 输入输出重定向,管道符,通配符
一.键盘输入读取read read [选项] [变量名] -p [显示信息] 在等待read输入时,输出提示信息 -t [秒数] 指定read输入等待时间 -n [字符数] 指定read只接收n个字符 ...
- proguard 混淆工具的用法 (适用于初学者参考)
一. ProGuard简介 附:proGuard官网 因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的cla ...
- OC简单介绍
一.OC与C的对比 关键字 OC新增的关键字在使用时,注意部分关键字以"@"开头 方法->函数 定义与实现 数据类型 新增:BOOL/NSObject/id/SEL/bloc ...
- redis入门到精通系列(三):key的通用操作和redis内部db的通用操作
五种数据类型都用到了key,key本身是一种字符串,通过key可以获取redis中保存的对象.这一篇博客就将介绍key的通用操作. (一)key基本操作 删除key del key key是否存在 e ...
- Oracle常用函数(SQL语句)
使用sql函数,您可以在一个select语句的查询当中,直接计算数据库资料的平均值.总数.最小值.最大值.总和.标准差.变异数等统计.使用recordset对象时,也可使用这些sql函数. sql函数 ...
- oracle name
1.db_name 数据库名 SQL> connect xys/manager as sysdba 已连接. SQL> show user USER 为 "SYS" S ...