使用动态代理对网络请求接口进行面向对象封装

在android中常规的网络请求方式是把URL地址作为常量放在某个固定的类中,比如定义一个URLConstant,里面定义URL1/URL2/URL3等等,在使用的时候使用URLConstant.URL1这样的形式来获取真实的网络地址。而每一个网络接口的参数列表则是放在另外一个类或者临时赋值,在这样的设计情况下,在网络接口达到一定量的时候会出现一个URL地址找不到对应的参数列表的困扰,因为太多了。
或许在真实实践中可以通过注释或者规范的命名来规避这个问题,但是我们仍然需要考虑有没有一种更好的解决方案呢?比如这样来调用:

//调用:
IPersonServer iPersonServer = ServerBuilder.build(this, IPersonServer.class);
Person person = iPersonServer.getPersonById("003");
//定义:
@Intf("/persons")
public interface IPersonServer {

    @Request("/get")
    Person getPersonById(@Param("personId") String id);
}

看起来是不是非常清爽,我们请求一些数据的时候只需要调用相应的java接口以及方法即可,而不用关心这个网络接口需要哪些参数,因为这个java接口已经帮我们约束了,那么接下来我们就记录一下如何实现网络请求的面向对象封装。

有关Android热更新/热补丁的一种新的解决方案

在Android开发工作中热更新一直是个遗留问题,虽然GooglePlay或者苹果商店的应用审核中都是禁止App这么做的,但仍有大量的开发者想要通过热更新或者热补丁来对已经发布的应用进行更新,而不用重新打包发布一个新的版本,毕竟一个刚发布的应用如果因为一个小bug而让用户再次进行更新,一是用户体验不好,二是发布的过程太过繁琐。 之前也因为热更新的问题做过各种各样的尝试,包括H5,ReactNative,动态加载dex,使用Javascript和java交互等,单都因为各种原因造成不能在生产环境中使用。

方案 问题
H5/H5+ 性能瓶颈在于设备WebView对html和JS的解析效率, 且WebView的加载是异步的,界面初始化时会空白一段时间,尝试使用腾讯TBS以及H5+SDK效果并不理想,尝试使用各种mobileUI框架依然存在卡顿帧数过低等各种不理想的问题。
ReactNative RN是FaceBook提供的一个跨平台的开发框架,使用NodeJs来写JSX和CSS来进行布局和实现业务逻辑,门槛稍高(这不是问题),使用RN实现的Android和iOS应用可用达到和原生应用相媲美的流畅度(也确实是原生的),可以通过从服务器下载js文件来实现热更新,但是如果想要实现原生应用酷炫的效果则是不满足的,且自定义控件的事件传递会被RN容器干扰,RN本来是为iOS而设计的,近期才考虑兼容了Android,对android的支持也还暂时不充足。
动态加载dex 在Dalvik虚拟机下的android环境这个方案是可行的,但是在android4.4之后google发布了新的虚拟机(ART),因ART在app安装过程会对dex的bytecode进行优化并进一步解析成机器码,使得在程序运行期间hook代码变得更有难度,在不能放弃5.0及之后的用户的前提下,这个问题是致命的
Javascript 使用jDK或者webview解析Javascript也能实现一部分的业务逻辑转移,但此方案的局限性太大,不能大规模的使用。

上面这些是我从接触热更新到目前为止所踩过的坑,可以看到暂时是没有任何一个方案是比较完善或者能用在生产环境的。 那么下面,高能来了。

设计一个通用的卫星菜单

卫星菜单算是一个非常久远的控件效果了,到现在也存在了各种各样的开源的此类控件,至于为什么要重复造轮子,是因为翻阅了一些卫星菜单的实现源码发现这些代码水平参差不齐,无论是从整体设计或是逻辑实现或是代码简洁度以及扩展性上都没有找到比较满意的。 鉴于这个效果的实现并不复杂,还有昨天刚好做了个轮子(上篇),所以打算做一个可复用/可灵活配置/具有较好封装/可以当做普通View来使用的卫星菜单控件。 老规矩先上效果图:

不靠边360度示例 靠角90度示例 靠边180度示例

创建一个简单的android桌面APP

本篇通过创建一个简单的桌面应用程序来记录桌面应用的开发流程

创建一个桌面App并不难,只是日常的工作重心皆在普通的应用程序开发上,对桌面app并没有过多的关注, 下面通过新建一个简单的启动器来熟悉并记录桌面app的开发。 效果:

简单的桌面

为ViewPager创建可自由设置高亮样式的TabBar

Android提供了ActionBar/TabHost以及V7包中提供的MaterialDesign风格的TabLayout,供ViewPager切换时进行标识和切换page使用。 这种情况下或者没有滑动效果,或者存放不下太多tab,或者UI风格比较固定,在使用过程中不能畅快得实现想要的效果。 今天定义了一个可用设定演示的可滑动的tabView供以后使用,顺便做了gradle依赖。 看下效果:

PageViewTab示例 PageViewTab示例 PageViewTab示例

实现基于RecyclerView的树形组件封装

最近因项目需求需要一个可以进行展开收缩的多级树形控件,首先考虑的是ExpandableListView,但是这个控件只支持一级展开不符合需求, 之后在百度谷歌了一下发现有用List实现的多级树形控件,预览效果是不错的,但是经测试大量数据展开时会造成严重的卡顿现象,也不符合需求。 最终决定以RecyclerView封装一个可服用的多级树形组件,以满足大量数据的展开折叠,以及展开折叠的动画效果。
最终效果图:

员工效果图

,