做Android客户端一个半月的一点想法

想来离开上海才两个星期了,离开ODM公司也已经差两天3个月了,我很庆幸,自己走出泥潭,虽然也经历了40天的无业期,但总归结果是好的。

人啊,一旦有了点目标,还真是一往直前,自己都想不出自己哪里来的动力,明明都环境都已经很恶劣了,形势也很严峻了。

从Framework到Application,我真心建议应届毕业生先选择后者,不是说Framework不好,但总归没那么多地方能让你施展拳脚的。


接触上层的框架,是从找工作中期开始的,可能也是因为Android基础过了关,走到了二面上去,面试官问的这方面也多了起来,不会那就去看嘛,看会了再去下一家面,当时我是抱着这种心态的,所以面试官提出的框架,不管有的没的,我回去都会撸上个几个小时,从使用到实现,管他看不看得懂,先吞它一遍...哈哈哈奋斗


17年12月19号,我在一家做金融的APP公司入职了,首先肯定是撸他们的代码嘛,都有什么模块,什么业务逻辑,怎么实现的,接口回调,数据解析啥的,说真的,我由于以前没有做过这些(大学也没好好做项目)看起来那是一个懵啊,整天的状态就是,这是啥啊,咋回事,因为啥啊...大哭

持续了一个多星期吧,就没有这么纠结了,微笑因为老大给我了一个需求,让我实现一个二级界面,EXO???我连看都看不懂,直接让我去实现,好吧,毕竟给了我工资,我也不好说什么...开整吧,后台给了我三个接口文档,我内二级界面里面需要用的;UI给了我几张图(标记好了像素点的),我内二级界面需要实现的。 


就这么些东西,看了一会,先用postman试了试接口(我怕后台框我,哈哈哈),然后自己写了个小Demo,先把界面画出来(逻辑啥的后面再说呗),撸接口好说,调调参数就ok了。mmp,那个界面,弟弟我写了几天吧...RecycleView的嵌套,Indicator的款式,还有杂七杂八的一些小布局,总之这是我做App的第一个布局嘛,肯定会遇到各种麻烦的,我一直坚信所有的坑自己都踩了一遍,对自己提升才会大,不然总是听别人说,有什么意思(我是不是受虐狂...)。


这些搞好了以后,我就开始加血加肉了(mmp这是我犯得的第一个错,导致后来自己重构累吐血),完全面向过程式编程,你们都懂的,就是那种专门为了实现功能写的代码,惨目忍睹,不能给别人看的。但是讲道理我还是用了Retrofit和RxJava的,毕竟第一个星期看人家写的代码都是用这些的,我不用也不好意思啊。

写接口,实现类,写Adapter,写Holder,总之磨磨蹭蹭终于把这个东西实现了,但还是有很多细节问题,例如当时我用的一个接口是实时更新数据,我当时的做法是拿到数据后,和本地数据对比,然后填充,刷新整个RecycleView,后面再说这个坑(自己给自己挖坑)。还有问题就是无网络或者接口出现异常时的处理,这些我第一次写的时候都没有考虑到(也是自己一手一手写出的坑),还有为了实现一个吸顶的功能,各种算啊,算ActionBar高度,算状态栏高度,mmp最后还是怎么算都不对,然后可下算对了,展示时候还出错了(这个我提示一下,我大布局用的Linearlayout,然后当Y坐标走到这个地方的时候,把之前藏好的一模一样的Title展示出来,你们猜会出现什么问题)还有为了实现多种Type的view,写了几个模板,哇撒,写Adapter时候没把我自己难受死(坑多的不行,当时还不知道什么是floating这种东西)。

debug自己的代码差不多2天吧,终于把写好了,然后我老大看了代码以后一脸懵B(可能就像我第一周看他们的代码时一个感觉吧微笑),接下来我就有事做了,把自己的改成MVP架构。呵呵哒,我当时恬不知耻的问了下MVP模式该怎么写...虽然看过,但是看过和你用过是不一样的,所以我还是问了。大佬也是仁慈,给我讲了半个小时吧,我就开始了-----我的重构之旅!


重构之前,我先说一下我自己写的那些BUG吧微笑,首先是刷新整个RecycleView,由于刷新的速度过快,又是整个刷新,导致用户的点击事件会被吃掉,当页面刷新时用户点击,没有进行跳转,总之就是没有响应用户的操作吧,解决这个我就是重新写了下逻辑,让其只刷新其中一个Item中的展示数据的View。(这里面有个问题我顺便提一下,关于刷新RecycleView的,你直接notifyDataSetChanged 或者notifyItemChanged(int)是没有用的!!!想知道为什么嘛?

嘻嘻嘻,我就简单说一下:网上博客一大堆你们也可以找,有人会说,我用怎么就没有这个问题呢,emmm我觉得应该是你项目的代码里面哪里的进行第二次请求,导致调用到了onBindViewHolder,因为你看源码就知道notify的时候是没有调用onBindViewHolder,所以你的View根本就不会重新绘制!想让他刷新的话,下面我给两个方案吧:

1.adapter.notifyItemInserted();

   adapter.notifyItemChanged();

   adapter.notifyItemMoved();

   adapter.notifyItemRemoved();

   adapter.notifyItemRangeChanged();

   adapter.notifyItemRangeInserted();

   adapter.notifyItemRangeRemoved();

你这样通知一下,才行.... 或者你觉得太麻烦了你可以这样notifyItemInserted(getItemCount());,但是这样就是末尾更新,你懂我意思吧。嗯 ,你懂得

2.重写notifyItemChanged(),让其去调用onBindViewHolder,这种不怎么推荐,因为其没有刷新的根本原因不在这个方面里面,这样写不知道会不会有别的问题...

关于RecycleView我就说这些吧(emmm,我实在忍不住,再说最后一个点吧,刷新单个item的时候会出现闪烁问题,我写的代码真的出现这个问题了,我的解决办法是,把RecycleView自带的动画屏蔽掉了,简单粗暴,但是你要是对动画有要求就只能另寻他路了,直接上代码:((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false); //嗯,就这一行,哈哈哈,多了我也不能写啊,最好的程序员知道什么状态么,就是不写代码,最好还能删一些。 你们懂我意思吗,我猜你懂。


再说一下吸顶的坑,因为我用的是LinearLayout,所以在一个View从GONE到VISIBLE的时候,要重新布局,就会闪烁一下,把LinearLayout改成Framelayout或者ConstraintLayout(新的布局,推荐大家去看一下,毕竟要跟的上技术更新的速度嘛)


重构之路:

将自己写的渣渣代码,改成MVP模式,首先呢要明确 P是干什么的,简单一句话概括,全是Java,没有Android!

你们懂我意思么...emmm,过程数据的处理,接口的调用等等再P中进行,但是他会持有一个View的对象,这样可以在数据处理完毕之后通知View去更新,这回懂了吧!!!

然后说一下接口的事情,后台给你的接口,有很多时候是需要并发使用的,也就是说,你的动作要在这两个接口都调用结束后再进行,那么就要用异步,最开始我自己写了个Sync锁(mmp后面才知道RxJava的flatMap可以帮你处理这种事情)

重构之路很漫长,我把这个模块重构好了以后,1月底(27号)我就离开上海了,到了北京,北京的故事后面再说吧,今天有点累了...(剧透一下,看了新公司的代码,我才觉得一句话是至理名言:任何一个傻瓜都能写出计算机可以理解的代码,唯有写出人类容易理解的程序才是一个好程序员)下次我会写一写,代码重构里面的模块组件化这些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值