在暑假尝试开发了一个APP.


界面图

APP开发总结_java


功能

动态发布、发布个人网站、视频教学、外卖订餐(小程序).

暂时只支持qq登录


整体采用MVP设计模式.

小程序是18年开发的一个,APP直接跳转到小程序


链接

校内网:

http://10.3.0.137/chuxin_1.0.4.apk


阿里云服务器:(下载慢)

https://www.houxinlin.com/School/res/app/android/chuxin_1.0.4.apk


阿里云OSS:

https://hxlbucket.oss-cn-huhehaote.aliyuncs.com/chuxin_1.0.4.apk


其中也遇到不少问题


1.选择Android Support还是Androidx

由于谷歌发布了Android Support的升级版Androidx,并且两个不能共存.

考虑到程序中可能使用到其他框架,如果使用的框架没有Androidx版本,那就得手写,但是Android Support肯定是有的,所以最终选择了Android Support库


2.选择Android targetSdkVersions版本

Android系统通过targetSdkVersion来保证Android的向前兼容性,targetSdkVersion越高,适配的工作就越多,更何况我还不太了解各个android 版本之间的变动.


但是!

最终还是选择了一个比较高的版本27,对应的android是8.1,这就意味着要解决6.0中动态权限,8.0中的通知渠道适配等一系列适配方案


3.框架选择

从0开始写那是不可能了,只好坐着别人的轮子起飞.

程序中用到了大量框架,用EventBus实现Fragment和Activity之间通信,MainActivity中管理着底部导航,二次点击首页的时候通过EventBus告诉MainFragment要进行动态刷新.

还有以下:

Voller进行网络请求.

ButterKnife进行view绑定.

Fastjson进行json和对象之间转换

glide进行图片加载

此处省略数十个.


比较难做的还是视频播放了,用VideoView不太可能了.所以对比了大量视频播放框架,最终选择了GSYVideoPlayer,云课堂智慧职教视频播放应该也是用他,很喜欢它的横竖屏切换过度动画,唯一发现了一个缺点是在视频比较短的时候左右滑动切换进度,不会那么准确.


还有一个当然是图片压缩了,动态发布要实现图片上传,现在手机拍照几本都在几M,不仅上传慢,而且在移动网时还飞流量.最终选择了Luban框架,号称最接近微信朋友圈的算法

APP开发总结_java_02

确实不赖,压缩后保存到一个文件夹,进行上传,最后就要记得删除了.


4.网络请求

小心的是如果网络请求回调成功,但是Activity已经结束了.在进行相关view设置就会NullPointerException.

可以用isFinishing()判断一下是否结束,或者通过Voller取消指定tag.


此问题在小程序中依然存在,如果一个功能是定时请求网络,但是不推荐使用

setTimeout,假如每2秒去请求,在第一个请求发出去2秒未响应,接着第2个请求紧跟其后,第2请求个2秒后假如也未响应,在第n个请求发出去的时候瞬间都响应了,那么这些请求都会立马执行后续的方法.view可能在1秒内更新数次.


推荐的做法是使用setInterval.当第一个请求发出去后,不管成功失败,都调用setInterval进行延时请求.


setTimeout和setInterval都返回一个id,用来结束定时,在界面关闭后,并且通过clearInterval结束了这个id,但是网络请求已经发出去了,还并未成功回调,等成功回调后,根据定时的逻辑,又会调用setInterval进行下一次请求.


可是这个问题我还没解决呢,如果知道的小伙伴能否有幸请教一下?



5.include

有几个layout会在不同activity中显示,那就要把通用的layout抽出来单独放在一个xml中,当时候使用include去引入,节省时间.


此处省略若干...


后端


采用目前很流行的Spring Boot框架,Web 应用服务器使用Tomcat.数据库使用Mysql.


第一次学Spring Boot的时候只能手里握着草.希望有生之年能见见他们团队.


Mysql中需要注意的一个是表情,用utf-8是不能存放的,需要改成utf8mb4.

把表中字段转成JavaBean的时候可以用mybatis的一个插件

APP开发总结_java_03

配置生成规则后可自动生成Model、Mapper、Example(条件查询).如下图

APP开发总结_java_04



系统错误是必不可少的,可以使用@RestControllerAdvice+@ExceptionHandler注解拦截全局异常,输出到客户端,比如这样

APP开发总结_java_05


后端中可能还要通过http请求其他服务,比如调用qq的用户信息获取接口,可以使用其他网络请求框架,但是我使用的是RestTemplate,更优雅.属于springframework框架下的,不需要额外引入其他jar包.

APP开发总结_java_06


都9012年了,别用Date,Calendar了,要学会使用新api,java 13都出土了,还有谷歌都推荐的kotlin.(可是我也不怎么会)

APP开发总结_java_07


org.springframework.jmx.export.UnableToRegisterMBeanException

多个Spring Boot在Tomcat中启动的话可能出现这个异常,原因是都使用了默认名称.

APP开发总结_java_08

JMX还不算太熟悉,我也不引用网络上的介绍了,太专业了,解决办法在application.properties中加入spring.jmx.default-domain=AppSchool配置,起一个名称,或者spring.jmx.enabled=false禁用JMX


此处省略若干...


Tomcat

最后就是tomcat了,云服务器使用阿里云学生机9.9一月还包邮的那种.系统使用ubuntu,如果想远程部署war,我知道的有以下三种办法


  1. 使用Xftp 工具直接上传到webapps目录下

  2. 使用webapps下的manager项目,tomcat自带,用来管理tomcat项目.需要配置用户名和密码才能登录

  3. 配置idea一键部署


第三种方法也是需要配置Tomcat中bin/catalina.sh文件的,

startup.sh/startup.bat都是进行一些判断后通过catalina启动.


IDEA

使用过程中出现过闪退,闪退就闪退吧,端口还被残留的进程占用.可以通过以下命令进行关闭

APP开发总结_java_09

netstat 显示IP、TCP、UDP和ICMP协议相关的统计数据

tasklist 列举所有进程

taskkill 终止进程

findstr 用来查找字符