(本博客为原创:https://cloud.tencent.com/developer/user/1148436/activities)
My BananaCloud Android Application
前言: 这算是我的第一个 完完全全 由自己开发的
社交类安卓APP
,截止2016-7-15,第二版本的优化完善已顺利完成,可以正常使用。下面我将一 一讲述各个点,日后如果不上线,那么将考虑全面开源,含移动端代码、服务器接口代码,留意我的 GitHub。 由于内容十分地多,我尽我自己的能力将各个功能模块的做法尽可能地去讲清楚,欢迎留言,有问必复,文章会不断更新,下面所有谈及的功能皆已实现。
一 、功能架构
二 、移动端架构概述
三、服务端架构概述
敏感词检索
,例如脏话内容布局各不相同
) 说实话,这个项目的文件夹已达1.5G,安装包混淆编译后27M,我在写之前,就在想要怎么把它摊开来讲,想想真的很复杂,脑子东西东西太多。
static final int/String
或 65535限制,在使用框架的时很多时候,都是只使用其中的一个功能。
现在我只保留了一个
,不包括第三方SDK,例如OneKeyShare,保留的是 imageLoader
,保留它的原因是,它的功能就是显示图片,而对于图片这类数据,可以说是占内存最大的大头,我能力有限,暂时还不能利用系统库封装好个比imageLoader更好的库,同类的库还有 picasso、fresco、volley等,曾经也引入过 fresco,比imageLoader多了很多API,考虑到框架的成熟性最后没使用,volley就不仅仅是显示个图片那么简单了,还有网络请求,上传等,网络请求和上传的代码这部分因为我自己能够写出还不错的几个函数,所以为了减少不必要的消耗,没使用volley。网络请求和上传的代码这部分
,如果自己封装好,且封装得不错,就不需要再去使用框架。轻量级
)
它是Blibli技术团队开源的一个视频播放框架,原框架需要自己编译.so,我当时在他们的基础上编译和封装好了一个,详情移至我 github 的 ijkplayerDemo 重量级
)
国外的一个视频播放框架,体积比较大,一样需要自己动手编译.so,相比ijk,它功能强大一点,详情移至我 github 的 VlcDemo我最终的选择
由于我网络请求这块没使用框架,所以线程的选用时 Thread + Handler
组合或 AsyncTask
,需要明确一点,AsyncTask 比 Thread + Handler 更耗资源,不过使用起来比较方便。
Android 的数据存储方式有5种,分别是 SharedPrefrences、File、SQLite、ContentProvider、NetWork。我采用的是 SharedPrefrences 和 File即是文件存储,其中
帖子分享,我采用的 OneKeyShare SDK,之所以使用它,是因为它把绝大部分的平台的SDK分享接口都集成了,例如微信、QQ、QQ空间、新浪微博、知乎等等等等。
鉴黄图,这是最重要的
!线程池
上传,一来方便控制并发数,二来方便回收内存选用了安卓5.0 的 SwipeRefreshLayout + RecyclerView,原因是 SwipeRefreshLayout 自身带有下拉刷新,最早的时候使用的是 PullToRefresh 开源项目。RecyclerView 重写onScroll() 就可以搞定加载更多,还有一个原因,RecyclerView 自带有瀑布流布局属性。 早之前我使用的是 LinearLayout 实现的,不断地 addView 再 remove,致命的缺点是内存消耗不合理。
帖子的类型有三种
,这三种帖子除了内容部分布局不一样,评论布局是一样的,分享、删除等按钮也是一样的,当然,也可以自己通过接口改变评论布局。所以在类的集成方面,我采用了三个抽象类父类
,子类只需要传进入自己布局、实现评论数据适配器 Adapter 即可。 采用的布局是 HeaderView + CommentView,HeaderView 用于显示帖子的所有内容含帖子点赞,CommentView 用来显示用户的评论
消息提醒采用了极光推送的SDK实现
收藏、删除、举报,这些操作进行一次get操作,传递帖子的id给服务器,服务器处理完毕后,就做对应操作
其他功能能的实现基本同上述。
第三方
自己派生
第二部分结束得有点匆忙,
我真的很想把所有的东西都写下来
,如果加上我一路遇到过的 bug 及其解决方法,估计还要写两天。主要原因是,有很多我记得已经不是太清楚了。
最初的我并没有采用 InnoDB,而是所有表都是全部是 MyISAM 。改用的原因是MyISAM 不支持事务InnoDB支持事务,而且社交类APP的数据库操作过多偏向于insert
、update
、delete
这种操作如果涉及多表或单表互联操作的情况,为了避免数据写脏,所以使用事务。因为整个过程中若一条错误,便可以回滚到开始时的状态。
写操作
的表采用InnoDB引擎 对于数据库设计,不应该过多依赖范式,适度的冗余
可以加快搜索速度,在服务器的配置还可以的情况下,可以采用冗余来解决查找慢的问题。
常被 update
的字段,不应该出现在多张表,应该使用一张表,例如用户的名称,userName 这个肯定是会被经常改变的。否则在update数据的时候你要多张表更新!