在暑假尝试开发了一个APP.
界面图
功能
动态发布、发布个人网站、视频教学、外卖订餐(小程序).
暂时只支持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框架,号称最接近微信朋友圈的算法
确实不赖,压缩后保存到一个文件夹,进行上传,最后就要记得删除了.
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的一个插件
配置生成规则后可自动生成Model、Mapper、Example(条件查询).如下图
系统错误是必不可少的,可以使用@RestControllerAdvice+@ExceptionHandler注解拦截全局异常,输出到客户端,比如这样
后端中可能还要通过http请求其他服务,比如调用qq的用户信息获取接口,可以使用其他网络请求框架,但是我使用的是RestTemplate,更优雅.属于springframework框架下的,不需要额外引入其他jar包.
都9012年了,别用Date,Calendar了,要学会使用新api,java 13都出土了,还有谷歌都推荐的kotlin.(可是我也不怎么会)
org.springframework.jmx.export.UnableToRegisterMBeanException
多个Spring Boot在Tomcat中启动的话可能出现这个异常,原因是都使用了默认名称.
JMX还不算太熟悉,我也不引用网络上的介绍了,太专业了,解决办法在application.properties中加入spring.jmx.default-domain=AppSchool配置,起一个名称,或者spring.jmx.enabled=false禁用JMX
此处省略若干...
Tomcat
最后就是tomcat了,云服务器使用阿里云学生机9.9一月还包邮的那种.系统使用ubuntu,如果想远程部署war,我知道的有以下三种办法
使用Xftp 工具直接上传到webapps目录下
使用webapps下的manager项目,tomcat自带,用来管理tomcat项目.需要配置用户名和密码才能登录
配置idea一键部署
第三种方法也是需要配置Tomcat中bin/catalina.sh文件的,
startup.sh/startup.bat都是进行一些判断后通过catalina启动.
IDEA
使用过程中出现过闪退,闪退就闪退吧,端口还被残留的进程占用.可以通过以下命令进行关闭
netstat 显示IP、TCP、UDP和ICMP协议相关的统计数据
tasklist 列举所有进程
taskkill 终止进程
findstr 用来查找字符