缘起

微信精选的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. 解决Gitlab的The remote end hung up unexpectedly错误,解决RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 Request Entity Too Large问题

    解决Gitlab的The remote end hung up unexpectedly错误 解决RPC failed; HTTP 413 curl 22 The requested URL retu ...

  2. R语言中的read.table()

    参考资料:http://www.cnblogs.com/xianghang123/archive/2012/06/06/2538274.html read.table(file, header = F ...

  3. cp -拷贝文件出现错误

    对于cp -a最主要的用法是在保留原文件属性的前提下复制文件. 如果出现了拷贝文件错误,在文件前面加上-a 即可

  4. 【leetcode】1217. Minimum Cost to Move Chips to The Same Position

    We have n chips, where the position of the ith chip is position[i]. We need to move all the chips to ...

  5. SpringMVC responseBody注解分析

    @responsebody表示该方法的返回结果直接写入HTTP response body中一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@respo ...

  6. 【Linux】【Basis】磁盘分区

    1. Linux磁盘及文件系统管理 1.1. 基本概念: 1.1.1. 磁盘接口类型: IDE(ata):并口,133MB/s,设备/dev/hd[a-z] SCSI:并口,Ultrascsi320, ...

  7. 【C/C++】函数的分文件编写

    创建同名的头文件(.h)和cpp文件. 在头文件里写函数声明,在cpp文件中写函数定义. 在cpp文件中写#include "xx.h" //自定义头文件名 框架(include ...

  8. 为什么Redis集群有16384个槽

    一.前言 我在<那些年用过的Redis集群架构(含面试解析)>一文里提到过,现在redis集群架构,redis cluster用的会比较多. 如下图所示 对于客户端请求的key,根据公式H ...

  9. Sql Server、Oracle、MySQL 日期格式化函数处理

    目录 Sql Server Oracle MySql Sql Server CONVERT ( '取数长度' , '时间' , '类型') 查询对应时间: 2021-03-17T19:18:18.00 ...

  10. Windows 10 彻底关闭 Antimalware Service Executable 降低内存占用

    概述 最近给内网的一台电脑安装 Windows 10 专业版系统,由于此电脑不会涉及到不安全因素,所以杀毒软件非必须. 以最大限度节省系统资源考虑,默认安装的 Micoroft Defender 占用 ...