缘起

微信精选的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很不好用!

  1. 很差的进度提醒机制
  2. 很差的错误识别与处理机制
  3. 很差的数据重新记载体验
  4. 无法查看大图

感觉每个都很影响体验,目前的实现非常不爽,代码看了代码之后就会知道我为了识别网页错误在多少地方做了监听处理。而且查看大图和下载也没有实现。

希望大家能给出好的WebView的封装框架,因为我一直没找到这方面的开源项目。

同时缺少了分享模块、搜索模块。

截图

下载

二维码:

(暂时只能通过Fir,其他的应用商店还在审核,应用宝审核已被打回两次,你懂。)

总结

花了一整天对项目进行了重构,优化了一天处理界面、开源和本博客,时间其实还是没用很多的。再次感谢这个框架Beam,真是程序员的福音。

这个项目本来不打算开源的,但是我感觉用了框架之后自己写的东西就很少了,干脆开源。

但是本作者保留一切商业化的权利。

一切基于本项目的修改都必须开源,并且采用相同的开源协议。

好了,本项目的地址是:https://github.com/fuxuemingzhu/WeChoice,欢迎Star和Fork。

【Android开发】微信精选,文章资讯类App开发记录总结的更多相关文章

  1. iOS开发之常用资讯类App的分类展示与编辑的完整案例实现(Swift版)

    上篇博客我们聊了<资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0)>,今天的这篇博客就在上篇博客的基础上做些东西.做一个完整的资讯类App中的分类展示 ...

  2. iOS开发之资讯类App常用分类控件的封装与实现(CollectionView+Swift3.0+)

    今天博客中,我们就来实现一下一些常用资讯类App中常用的分类选择的控件的封装.本篇博客中没有使用到什么新的技术点,如果非得说用到了什么新的技术点的话,那么勉强的说,用到了一些iOS9以后UIColle ...

  3. 分享一下怎么开发一款图片视频类App,秒拍和prisma

    第一步,分解短视频App的功能 我们在秒拍官网看到如此描述: [视频拍摄及导入]支持直接拍摄及导入手机本地的视频 [照片电影]照片专属特效,轻松创作照片电影 [MV特效]10余款全新MV特效,让普通视 ...

  4. 史上最简单的个人移动APP开发入门--jQuery Mobile版跨平台APP开发

    书是人类进步的阶梯. ——高尔基 习大大要求新新人类要有中国梦,鼓励大学生们一毕业就创业.那最好的创业途径是什么呢?就是APP.<构建跨平台APP-jQuery Mobile移动应用实战> ...

  5. 产品开发也要看阵容,APP开发只需五步变得靠谱

    最早认识的一个朋友是程序员,曾经到一家外包公司接单子,小外包公司经常遇到的问题就是和需求方谈产品功能.客户要做外包,对方让他一次性报价,但是客户连功能点自己都不清楚,这时朋友说还是按照具体功能点来做吧 ...

  6. webstorm开发微信小程序代码提醒(webstorm开发工具)

    使用了微信提供的开发工具是真心难用,卡顿厉害.中英文切写注释换相当不爽.还没办法多开窗口,相信大家也遇到过这种现象. 下边我们介绍下webstorm来开发微信小程序的一些配置: File---sett ...

  7. app开发制作会难吗?app开发好学吗?

    前面我们讲到了app是什么,APP是运行在智能手机的第三方应用程序,可以满足用户的不同需求.那么app开发制作会难吗?这个与产品的复杂度有很大的关系,复杂度包括业务逻辑多不多,业务模块多不多等,对于玩 ...

  8. Android中微信抢红包插件原理解析和开发实现

    一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  9. 贷款资讯类APP、贷款资讯网站廉价卖,需要的进来看看

    [app介绍]卡贷资讯app为您提供信用卡申请攻略及借款资讯以及贷款口子,让你借钱借款路上不再愁.[功能特点]1.资讯:聚合各种贷款资讯知识,掌握核心信用卡申请攻略,借款借钱不亏,亦不被骗:2.工具: ...

随机推荐

  1. 比对软件Blast,Blast+,Diamond比较

    1. Blast (1)格式化数据库 formatdb -i db.seq -p T -o T -l logfile 主要参数: -i 输入需要格式化的源数据库名称 -p 文件类型,是核苷酸序列数据库 ...

  2. nginx_日志

    192.168.31.250 - - [13/Nov/2019:08:38:07 +0800] "GET /aa HTTP/1.1" 404 571 "-" & ...

  3. git创建项目,代码仓库

    1.首先在服务端远程创建仓库 mkdir  project.git cd  project.git git  --bare init 2.在本地创建项目推送到远程服务端仓库 mkdir  myproj ...

  4. Oracle-怎么在表的特定位置增加列

    create table tmp as select ID,UserName,RealName,Sex,Tel,Addr from tabName;drop table tabName;rename ...

  5. Linux命令行批量删除文件(目录)

    快速-批量删除文件或目录 1-1.快速删除大文件夹(注意目录后的结束符'/')(对于含有海量文件的目录,不能直接rm -rf删除,这样效率很慢:) rsync -a --delete blank/ t ...

  6. 04 Windows安装python运行环境

    安装python运行环境 使用微信扫码关注微信公众号,并回复:"Python工具包",免费获取下载链接! 1.卸载程序(电脑未装此程序,跳过此过程) 卸载这两个程序 出现下图所示, ...

  7. C#筛选项联动,联动筛选

    protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { FillDep(); } // FillDG(); ...

  8. 学习java的第六天

    一.今日收获 1.开始了学习手册第二章的学习 2.了解了java里的常量与变量以及数据类型,与c语言的内容类似 二.今日难题 1.都是基础知识,没有什么难题 三.明日目标 1.继续学习java学习手册 ...

  9. day19 进程管理

    day19 进程管理 什么是进程,什么是线程 1.什么是程序 一般情况下,代码,安装包等全部都是应用程序 2.什么是进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进 ...

  10. 数仓day04----日志预处理2

    1.详细描述idmap的整个计算方案 (1)使用SparkSession对象读取用户不同类别的埋点日志,解析并抽取出相应的标识id,使用union进行合并,得到装有汇总标识id的rdd(ids) (2 ...